diff --git a/src/ClientServer/Controllers/Core/CustomProjects/EditCustomProjectController.cs b/src/ClientServer/Controllers/Core/CustomProjects/EditCustomProjectController.cs index e0f872bea77d5b36cac71df3ae64a10d5ccb35df..9ce22a0cbdaf42c82200d3a80548d429511dd42c 100644 --- a/src/ClientServer/Controllers/Core/CustomProjects/EditCustomProjectController.cs +++ b/src/ClientServer/Controllers/Core/CustomProjects/EditCustomProjectController.cs @@ -134,6 +134,7 @@ namespace ClientServer.Controllers.Core.customProjects MemoryLimitInKb = p.TestSettings.MemoryLimitInKb, TimeoutInMs = p.TestSettings.TimeoutInMs, CompileTimeoutInMs = p.TestSettings.CompileTimeoutInMs, + CompilerOptions = p.TestSettings.CompilerOptions, } }).ToList() }; @@ -320,6 +321,7 @@ namespace ClientServer.Controllers.Core.customProjects TimeoutInMs = test.TestSettings.TimeoutInMs, MaxDiskSpaceInKb = test.TestSettings.MaxDiskSpaceInKb, CompileTimeoutInMs = test.TestSettings.CompileTimeoutInMs, + CompilerOptions = test.TestSettings.CompilerOptions, }, }); } @@ -766,6 +768,7 @@ namespace ClientServer.Controllers.Core.customProjects MemoryLimitInKb = testFullBase.TestSettings.MemoryLimitInKb, TimeoutInMs = testFullBase.TestSettings.TimeoutInMs, CompileTimeoutInMs = testFullBase.TestSettings.CompileTimeoutInMs, + CompilerOptions = testFullBase.TestSettings.CompilerOptions, } }; @@ -800,6 +803,7 @@ namespace ClientServer.Controllers.Core.customProjects MemoryLimitInKb = newTest.TestSettings.MemoryLimitInKb, TimeoutInMs = newTest.TestSettings.TimeoutInMs, CompileTimeoutInMs = testFullBase.TestSettings.CompileTimeoutInMs, + CompilerOptions = testFullBase.TestSettings.CompilerOptions, } }; @@ -875,6 +879,7 @@ namespace ClientServer.Controllers.Core.customProjects oldTest.TestSettings.MaxDiskSpaceInKb = testFullBase.TestSettings.MaxDiskSpaceInKb; oldTest.TestSettings.MemoryLimitInKb = testFullBase.TestSettings.MemoryLimitInKb; oldTest.TestSettings.TimeoutInMs = testFullBase.TestSettings.TimeoutInMs; + oldTest.TestSettings.CompilerOptions = testFullBase.TestSettings.CompilerOptions; //assets are managed separately @@ -915,6 +920,7 @@ namespace ClientServer.Controllers.Core.customProjects MemoryLimitInKb = oldTest.TestSettings.MemoryLimitInKb, TimeoutInMs = oldTest.TestSettings.TimeoutInMs, CompileTimeoutInMs = testFullBase.TestSettings.CompileTimeoutInMs, + CompilerOptions = testFullBase.TestSettings.CompilerOptions, } }; @@ -1154,7 +1160,6 @@ namespace ClientServer.Controllers.Core.customProjects Hash = "", MimeType = file.ContentType, OriginalName = file.FileName, - RelativePath = targetHardDrivePath }; var connection = new CustomProjectDescriptionWithFileAsAssetReference() @@ -1591,7 +1596,6 @@ namespace ClientServer.Controllers.Core.customProjects Hash = "", MimeType = file.ContentType, OriginalName = file.FileName, - RelativePath = targetHardDrivePath }; var connection = new CustomProjectTestWithFileAsAssetReference() diff --git a/src/ClientServer/Controllers/Core/Exercises/DoExerciseAfterSolution/DoExerciseAfterSolutionController.cs b/src/ClientServer/Controllers/Core/Exercises/DoExerciseAfterSolution/DoExerciseAfterSolutionController.cs index 8827f9c5671850774e5701c4a8c373e9aa58ee87..63ffb6a6c1079580c5a889a2c7542c98535093e0 100644 --- a/src/ClientServer/Controllers/Core/Exercises/DoExerciseAfterSolution/DoExerciseAfterSolutionController.cs +++ b/src/ClientServer/Controllers/Core/Exercises/DoExerciseAfterSolution/DoExerciseAfterSolutionController.cs @@ -902,6 +902,7 @@ namespace ClientServer.Controllers.Core.Exercises.DoExerciseAfterSolution MemoryLimitInKb = p.Test.TestSettings.MemoryLimitInKb, TimeoutInMs = p.Test.TestSettings.TimeoutInMs, CompileTimeoutInMs = p.Test.TestSettings.CompileTimeoutInMs, + CompilerOptions = p.Test.TestSettings.CompilerOptions, }, Result = p.Result == null ? null diff --git a/src/ClientServer/Controllers/Core/Exercises/DoExerciseController.cs b/src/ClientServer/Controllers/Core/Exercises/DoExerciseController.cs index 3d84a947dd968528d290f245a2946e6f80b06b41..0c2eec80be6bca733efd24099d2e9443edf14f68 100644 --- a/src/ClientServer/Controllers/Core/Exercises/DoExerciseController.cs +++ b/src/ClientServer/Controllers/Core/Exercises/DoExerciseController.cs @@ -311,6 +311,7 @@ namespace ClientServer.Controllers.Core.Exercises TimeoutInMs = test.TestSettings.TimeoutInMs, MaxDiskSpaceInKb = test.TestSettings.MaxDiskSpaceInKb, CompileTimeoutInMs = test.TestSettings.CompileTimeoutInMs, + CompilerOptions = test.TestSettings.CompilerOptions, }, Files = test.AssetReferences.Select(p => new FilePreviewFromBackend() { @@ -348,7 +349,8 @@ namespace ClientServer.Controllers.Core.Exercises MaxDiskSpaceInKb = defaultCustomTestSettings.MaxDiskSpaceInKb, TimeoutInMs = defaultCustomTestSettings.TimeoutInMs, MemoryLimitInKb = defaultCustomTestSettings.MemoryLimitInKb, - CompileTimeoutInMs = defaultCustomTestSettings.CompileTimeoutInMs + CompileTimeoutInMs = defaultCustomTestSettings.CompileTimeoutInMs, + CompilerOptions = defaultCustomTestSettings.CompilerOptions }; #endregion @@ -1300,7 +1302,8 @@ namespace ClientServer.Controllers.Core.Exercises MaxDiskSpaceInKb = p.Test.TestSettings.MaxDiskSpaceInKb, MemoryLimitInKb = p.Test.TestSettings.MemoryLimitInKb, TimeoutInMs = p.Test.TestSettings.TimeoutInMs, - CompileTimeoutInMs = p.Test.TestSettings.CompileTimeoutInMs + CompileTimeoutInMs = p.Test.TestSettings.CompileTimeoutInMs, + CompilerOptions = p.Test.TestSettings.CompilerOptions }, Result = p.Result == null ? null @@ -2927,7 +2930,6 @@ namespace ClientServer.Controllers.Core.Exercises Hash = "", MimeType = file.ContentType, OriginalName = file.FileName, - RelativePath = targetHardDrivePath }; var connection = new CustomTestWithFileAsAssetReference() diff --git a/src/ClientServer/Controllers/Core/Exercises/ExerciseEditorController.cs b/src/ClientServer/Controllers/Core/Exercises/ExerciseEditorController.cs index 39ccfa2a093f03446f89848d673f72a69de59e73..b52c7ca068f26e4fbae8ae95829a35059700ca6c 100644 --- a/src/ClientServer/Controllers/Core/Exercises/ExerciseEditorController.cs +++ b/src/ClientServer/Controllers/Core/Exercises/ExerciseEditorController.cs @@ -74,6 +74,7 @@ namespace ClientServer.Controllers.Core.Exercises TimeoutInMs = oldExercise.DefaultCustomTestSettings.TimeoutInMs, MaxDiskSpaceInKb = oldExercise.DefaultCustomTestSettings.MaxDiskSpaceInKb, CompileTimeoutInMs = oldExercise.DefaultCustomTestSettings.CompileTimeoutInMs, + CompilerOptions = oldExercise.DefaultCustomTestSettings.CompilerOptions, }, Tests = oldExercise.Tests.Select(p => new ExerciseTestFromBackend() { @@ -90,7 +91,8 @@ namespace ClientServer.Controllers.Core.Exercises MemoryLimitInKb = p.TestSettings.MemoryLimitInKb, MaxDiskSpaceInKb = p.TestSettings.MaxDiskSpaceInKb, TimeoutInMs = p.TestSettings.TimeoutInMs, - CompileTimeoutInMs = p.TestSettings.CompileTimeoutInMs + CompileTimeoutInMs = p.TestSettings.CompileTimeoutInMs, + CompilerOptions = p.TestSettings.CompilerOptions }, Files = p.AssetReferences.Select(asset => new FilePreviewFromBackend() { @@ -180,6 +182,7 @@ namespace ClientServer.Controllers.Core.Exercises TimeoutInMs = oldExercise.DefaultCustomTestSettings.TimeoutInMs, MaxDiskSpaceInKb = oldExercise.DefaultCustomTestSettings.MaxDiskSpaceInKb, CompileTimeoutInMs = oldExercise.DefaultCustomTestSettings.CompileTimeoutInMs, + CompilerOptions = oldExercise.DefaultCustomTestSettings.CompilerOptions, }, Tests = oldExercise.Tests.Select(p => new ExerciseTestFromBackendWithData() { @@ -196,7 +199,8 @@ namespace ClientServer.Controllers.Core.Exercises MemoryLimitInKb = p.TestSettings.MemoryLimitInKb, MaxDiskSpaceInKb = p.TestSettings.MaxDiskSpaceInKb, TimeoutInMs = p.TestSettings.TimeoutInMs, - CompileTimeoutInMs = p.TestSettings.CompileTimeoutInMs + CompileTimeoutInMs = p.TestSettings.CompileTimeoutInMs, + CompilerOptions = p.TestSettings.CompilerOptions, }, Files = p.AssetReferences.Select(asset => new TestAssetFromBackendWithData() { @@ -424,7 +428,8 @@ namespace ClientServer.Controllers.Core.Exercises MemoryLimitInKb = exerciseFromFrontend.DefaultTestSettings.MemoryLimitInKb, TimeoutInMs = exerciseFromFrontend.DefaultTestSettings.TimeoutInMs, MaxDiskSpaceInKb = exerciseFromFrontend.DefaultTestSettings.MaxDiskSpaceInKb, - CompileTimeoutInMs = exerciseFromFrontend.DefaultTestSettings.CompileTimeoutInMs + CompileTimeoutInMs = exerciseFromFrontend.DefaultTestSettings.CompileTimeoutInMs, + CompilerOptions = exerciseFromFrontend.DefaultTestSettings.CompilerOptions, }; //var defaultTestCaseSettings = new List<DefaultCustomTestSetting>(); @@ -473,6 +478,7 @@ namespace ClientServer.Controllers.Core.Exercises TimeoutInMs = frontendTest.TestSettings.TimeoutInMs, MaxDiskSpaceInKb = frontendTest.TestSettings.MaxDiskSpaceInKb, CompileTimeoutInMs = frontendTest.TestSettings.CompileTimeoutInMs, + CompilerOptions = frontendTest.TestSettings.CompilerOptions, }, }); } @@ -857,6 +863,7 @@ namespace ClientServer.Controllers.Core.Exercises oldExercise.DefaultCustomTestSettings.MemoryLimitInKb = exerciseFromFrontend.DefaultTestSettings.MemoryLimitInKb; oldExercise.DefaultCustomTestSettings.TimeoutInMs = exerciseFromFrontend.DefaultTestSettings.TimeoutInMs; + oldExercise.DefaultCustomTestSettings.CompilerOptions = exerciseFromFrontend.DefaultTestSettings.CompilerOptions; #endregion @@ -905,6 +912,7 @@ namespace ClientServer.Controllers.Core.Exercises oldExerciseTest.TestSettings.MemoryLimitInKb = testCaseFromBackend.TestSettings.MemoryLimitInKb; oldExerciseTest.TestSettings.MaxDiskSpaceInKb = testCaseFromBackend.TestSettings.MaxDiskSpaceInKb; oldExerciseTest.TestSettings.TimeoutInMs = testCaseFromBackend.TestSettings.TimeoutInMs; + oldExerciseTest.TestSettings.CompilerOptions = testCaseFromBackend.TestSettings.CompilerOptions; oldExerciseTest.DisplayIndex = testCaseFromBackend.DisplayIndex; oldExerciseTest.TestType = testType; @@ -927,6 +935,7 @@ namespace ClientServer.Controllers.Core.Exercises MaxDiskSpaceInKb = testCaseFromBackend.TestSettings.MaxDiskSpaceInKb, TimeoutInMs = testCaseFromBackend.TestSettings.TimeoutInMs, CompileTimeoutInMs = testCaseFromBackend.TestSettings.CompileTimeoutInMs, + CompilerOptions = testCaseFromBackend.TestSettings.CompilerOptions, }, TestType = testType, }); @@ -952,6 +961,7 @@ namespace ClientServer.Controllers.Core.Exercises TimeoutInMs = frontendTest.TestSettings.TimeoutInMs, MaxDiskSpaceInKb = frontendTest.TestSettings.MaxDiskSpaceInKb, CompileTimeoutInMs = frontendTest.TestSettings.CompileTimeoutInMs, + CompilerOptions = frontendTest.TestSettings.CompilerOptions, }, }); } @@ -1534,7 +1544,8 @@ namespace ClientServer.Controllers.Core.Exercises CompileTimeoutInMs = exerciseTest.TestSettings.CompileTimeoutInMs, TimeoutInMs = exerciseTest.TestSettings.TimeoutInMs, MemoryLimitInKb = exerciseTest.TestSettings.MemoryLimitInKb, - MaxDiskSpaceInKb = exerciseTest.TestSettings.MaxDiskSpaceInKb + MaxDiskSpaceInKb = exerciseTest.TestSettings.MaxDiskSpaceInKb, + CompilerOptions = exerciseTest.TestSettings.CompilerOptions, }, AssetReferences = new List<TestWithFileAsAssetReference>(), }; @@ -1578,7 +1589,8 @@ namespace ClientServer.Controllers.Core.Exercises TimeoutInMs = oldExercise.DefaultCustomTestSettings.TimeoutInMs, CompileTimeoutInMs = oldExercise.DefaultCustomTestSettings.CompileTimeoutInMs, MaxDiskSpaceInKb = oldExercise.DefaultCustomTestSettings.MaxDiskSpaceInKb, - MemoryLimitInKb = oldExercise.DefaultCustomTestSettings.MemoryLimitInKb + MemoryLimitInKb = oldExercise.DefaultCustomTestSettings.MemoryLimitInKb, + CompilerOptions = oldExercise.DefaultCustomTestSettings.CompilerOptions, }, }; @@ -1737,7 +1749,6 @@ namespace ClientServer.Controllers.Core.Exercises Hash = "", MimeType = file.ContentType, OriginalName = file.FileName, - RelativePath = targetHardDrivePath }; var connection = new ExerciseDescriptionWithFileAsAssetReference() @@ -2129,7 +2140,6 @@ namespace ClientServer.Controllers.Core.Exercises Hash = "", MimeType = file.ContentType, OriginalName = file.FileName, - RelativePath = targetHardDrivePath }; var connection = new TestWithFileAsAssetReference() @@ -2614,6 +2624,11 @@ namespace ClientServer.Controllers.Core.Exercises /// the max disk space to users program can write to /// </summary> public int MaxDiskSpaceInKb { get; set; } + + /// <summary> + /// some compiler options .g. -Xlint options needs to be separated by whitespaces (like normal command args) + /// </summary> + public string CompilerOptions { get; set; } } #endregion diff --git a/src/ClientServer/Controllers/Core/Exercises/TutorViewAssessmentController.cs b/src/ClientServer/Controllers/Core/Exercises/TutorViewAssessmentController.cs index a35ada8cdcd729e80a13fb885bdbf9816e3a8da1..4a2cec3d513cf17a406f4c1532a3c50f991e01f2 100644 --- a/src/ClientServer/Controllers/Core/Exercises/TutorViewAssessmentController.cs +++ b/src/ClientServer/Controllers/Core/Exercises/TutorViewAssessmentController.cs @@ -286,6 +286,7 @@ namespace ClientServer.Controllers.Core.Exercises TimeoutInMs = test.TestSettings.TimeoutInMs, MaxDiskSpaceInKb = test.TestSettings.MaxDiskSpaceInKb, CompileTimeoutInMs = test.TestSettings.CompileTimeoutInMs, + CompilerOptions = test.TestSettings.CompilerOptions, }, Files = test.AssetReferences.Select(p => new FilePreviewFromBackend() { diff --git a/src/ClientServer/Controllers/Core/Init.cs b/src/ClientServer/Controllers/Core/Init.cs index 1c79550a987e00c46285999e159b0680aa239f3c..1b6821f2d478851f2d814c173e5910cf9632d6f3 100644 --- a/src/ClientServer/Controllers/Core/Init.cs +++ b/src/ClientServer/Controllers/Core/Init.cs @@ -347,7 +347,6 @@ namespace ClientServer.Controllers.Core MimeType = descriptionAsset.MimeType, SizeInBytes = descriptionAsset.Content.Length, Hash = "", - RelativePath = basePath }; var conn = new ExerciseDescriptionWithFileAsAssetReference() @@ -516,7 +515,6 @@ namespace ClientServer.Controllers.Core MimeType = testAsset.MimeType, SizeInBytes = testAsset.Content.Length, Hash = "", - RelativePath = basePath }; var conn = new TestWithFileAsAssetReference() @@ -625,7 +623,6 @@ namespace ClientServer.Controllers.Core MimeType = customTestAsset.MimeType, SizeInBytes = customTestAsset.Content.Length, Hash = "", - RelativePath = basePath }; var conn = new CustomTestWithFileAsAssetReference() @@ -735,7 +732,6 @@ namespace ClientServer.Controllers.Core MimeType = customAsset.MimeType, SizeInBytes = customAsset.Content.Length, Hash = "", - RelativePath = basePath }; var conn = new CustomProjectDescriptionWithFileAsAssetReference() @@ -905,7 +901,6 @@ namespace ClientServer.Controllers.Core MimeType = customProjectTestAsset.MimeType, SizeInBytes = customProjectTestAsset.Content.Length, Hash = "", - RelativePath = basePath }; var conn = new CustomProjectTestWithFileAsAssetReference() diff --git a/src/ClientServer/Controllers/Core/Testing/TestingController.cs b/src/ClientServer/Controllers/Core/Testing/TestingController.cs index ce165c28667659b44f4600e473981eb649598d43..a6b18bec7a68c24091613c4da4e40802e20ab056 100644 --- a/src/ClientServer/Controllers/Core/Testing/TestingController.cs +++ b/src/ClientServer/Controllers/Core/Testing/TestingController.cs @@ -188,7 +188,8 @@ namespace ClientServer.Controllers.Core.Testing TimeoutInMs = systemSettings.JustRunProgramTimeoutInMs, MemoryLimitInKb = systemSettings.JustRunProgramMemoryLimitInKb, MaxDiskSpaceInKb = systemSettings.JustRunProgramMaxDiskSpaceInKb, - CompileTimeoutInMs = systemSettings.JustRunProgramCompileTimeoutInMs + CompileTimeoutInMs = systemSettings.JustRunProgramCompileTimeoutInMs, + CompilerOptions = "", } }; @@ -334,6 +335,7 @@ namespace ClientServer.Controllers.Core.Testing MemoryLimitInKb = systemSettings.JustRunProgramMemoryLimitInKb, MaxDiskSpaceInKb = systemSettings.JustRunProgramMaxDiskSpaceInKb, CompileTimeoutInMs = systemSettings.JustRunProgramCompileTimeoutInMs, + CompilerOptions = "", } }; @@ -503,6 +505,7 @@ namespace ClientServer.Controllers.Core.Testing MemoryLimitInKb = systemSettings.JustRunProgramMemoryLimitInKb, MaxDiskSpaceInKb = systemSettings.JustRunProgramMaxDiskSpaceInKb, CompileTimeoutInMs = systemSettings.JustRunProgramCompileTimeoutInMs, + CompilerOptions = "", } }; @@ -1135,7 +1138,8 @@ namespace ClientServer.Controllers.Core.Testing TimeoutInMs = systemSettings.JustRunProgramTimeoutInMs, MemoryLimitInKb = systemSettings.JustRunProgramMemoryLimitInKb, MaxDiskSpaceInKb = systemSettings.JustRunProgramMaxDiskSpaceInKb, - CompileTimeoutInMs = systemSettings.JustRunProgramCompileTimeoutInMs + CompileTimeoutInMs = systemSettings.JustRunProgramCompileTimeoutInMs, + CompilerOptions = "", }; var justRunTest = new AllTest() @@ -3069,6 +3073,7 @@ namespace ClientServer.Controllers.Core.Testing CompileTimeoutInMs = test.TestSettings.CompileTimeoutInMs, MemoryLimitInKb = test.TestSettings.MemoryLimitInKb, MaxDiskSpaceInKb = test.TestSettings.MaxDiskSpaceInKb, + CompilerOptions = test.TestSettings.CompilerOptions, AllAssets = test.TestAssetsWithContent.Select(p => new TestAssetFileForTestServer() { FileName = p.DisplayName, @@ -3454,6 +3459,7 @@ namespace ClientServer.Controllers.Core.Testing /// <summary> /// the test content to use + /// test server will throw if this is null /// </summary> public string TestContent { get; set; } @@ -3476,6 +3482,11 @@ namespace ClientServer.Controllers.Core.Testing /// the max dispk space in kb the user program can write to /// </summary> public int MaxDiskSpaceInKb { get; set; } + + /// <summary> + /// some compiler options .g. -Xlint options needs to be separated by whitespaces (like normal command args) + /// </summary> + public string CompilerOptions { get; set; } /// <summary> /// all test asset files diff --git a/src/ClientServer/Migrations/20190606164356_RemoveAssetPathsAddedCompilerOptions.Designer.cs b/src/ClientServer/Migrations/20190606164356_RemoveAssetPathsAddedCompilerOptions.Designer.cs new file mode 100755 index 0000000000000000000000000000000000000000..4ce072284ee96887df857e349047e7663498ab30 --- /dev/null +++ b/src/ClientServer/Migrations/20190606164356_RemoveAssetPathsAddedCompilerOptions.Designer.cs @@ -0,0 +1,2241 @@ +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using ClientServer.Db; +using ClientServer.Models.Exercises.Release; + +namespace ClientServer.Migrations +{ + [DbContext(typeof(SyndromDbContext))] + [Migration("20190606164356_RemoveAssetPathsAddedCompilerOptions")] + partial class RemoveAssetPathsAddedCompilerOptions + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { + modelBuilder + .HasAnnotation("ProductVersion", "1.0.3"); + + modelBuilder.Entity("ClientServer.Models.AwaitDummy", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.HasKey("Id"); + + b.ToTable("AwaitDummies"); + }); + + modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProject", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<DateTime>("CreatedAt"); + + b.Property<string>("DisplayName") + .HasMaxLength(500); + + b.Property<int>("LastEditorPLangId"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<int>("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("CustomProjects"); + }); + + modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectDescription", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<string>("Content") + .HasMaxLength(10000); + + b.Property<DateTime>("CreatedAt"); + + b.Property<int>("CustomProjectId"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.HasKey("Id"); + + b.HasIndex("CustomProjectId") + .IsUnique(); + + b.ToTable("CustomProjectDescriptions"); + }); + + modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectDescriptionWithFileAsAssetReference", b => + { + b.Property<int>("CustomProjectDescriptionId"); + + b.Property<int>("FileReferenceUserFileAssetId"); + + b.HasKey("CustomProjectDescriptionId", "FileReferenceUserFileAssetId"); + + b.HasIndex("CustomProjectDescriptionId"); + + b.HasIndex("FileReferenceUserFileAssetId"); + + b.ToTable("CustomProjectDescriptionWithFileAsAssetReferences"); + }); + + modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectSolution", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<DateTime>("CreatedAt"); + + b.Property<int>("CustomProjectId"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<int?>("MainFileId"); + + b.Property<int>("PLangId"); + + b.HasKey("Id"); + + b.HasIndex("CustomProjectId"); + + b.HasIndex("MainFileId") + .IsUnique(); + + b.HasIndex("PLangId"); + + b.ToTable("CustomProjectSolutions"); + }); + + modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectSolutionFile", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<string>("Content") + .HasMaxLength(10000); + + b.Property<DateTime>("CreatedAt"); + + b.Property<int?>("CustomProjectSolutionId") + .IsRequired(); + + b.Property<int>("DisplayIndex"); + + b.Property<string>("FileNameWithExtension") + .HasMaxLength(500); + + b.Property<bool>("IsDisplayed"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.HasKey("Id"); + + b.HasIndex("CustomProjectSolutionId"); + + b.ToTable("CustomProjectSolutionFiles"); + }); + + modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectTest", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<string>("Content") + .HasMaxLength(5000); + + b.Property<DateTime>("CreatedAt"); + + b.Property<int>("CustomProjectId"); + + b.Property<int>("DisplayIndex"); + + b.Property<string>("DisplayName") + .HasMaxLength(500); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<int>("TestSettingsId"); + + b.Property<int>("TestTypeId"); + + b.Property<int>("Weight"); + + b.HasKey("Id"); + + b.HasIndex("CustomProjectId"); + + b.HasIndex("TestSettingsId") + .IsUnique(); + + b.HasIndex("TestTypeId"); + + b.ToTable("CustomProjectTests"); + }); + + modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectTestAsset", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<byte[]>("Content"); + + b.Property<DateTime>("CreatedAt"); + + b.Property<int?>("CustomProjectTestId") + .IsRequired(); + + b.Property<string>("DisplayName") + .HasMaxLength(500); + + b.Property<string>("Hash") + .HasMaxLength(500); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<string>("MimeType") + .HasMaxLength(500); + + b.HasKey("Id"); + + b.HasIndex("CustomProjectTestId"); + + b.ToTable("CustomProjectTestAssets"); + }); + + modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectTestWithFileAsAssetReference", b => + { + b.Property<int>("CustomProjectTestId"); + + b.Property<int>("FileReferenceUserFileAssetId"); + + b.HasKey("CustomProjectTestId", "FileReferenceUserFileAssetId"); + + b.HasIndex("CustomProjectTestId"); + + b.HasIndex("FileReferenceUserFileAssetId"); + + b.ToTable("CustomProjectTestWithFileAsAssetReferences"); + }); + + modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectTestWithSolutionAsTestResult", b => + { + b.Property<int>("CustomProjectSolutionId"); + + b.Property<int>("CustomProjectTestId"); + + b.Property<int?>("CompileTimeoutInMsUsed"); + + b.Property<DateTime>("CreatedAt"); + + b.Property<bool?>("HasCompiled"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<bool?>("Passed"); + + b.Property<int?>("ProgramExitCode"); + + b.Property<string>("Protocol") + .HasMaxLength(10000); + + b.Property<string>("RunnerVersion") + .HasMaxLength(500); + + b.Property<int?>("TestResultCode"); + + b.Property<string>("TestServerVersion") + .HasMaxLength(500); + + b.Property<int?>("TimeForCompiling"); + + b.Property<int?>("TimeForUserProgram"); + + b.Property<int?>("TimeoutInMsUsed"); + + b.HasKey("CustomProjectSolutionId", "CustomProjectTestId"); + + b.HasIndex("CustomProjectSolutionId"); + + b.HasIndex("CustomProjectTestId"); + + b.ToTable("CustomProjectTestWithSolutionAsTestResults"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.AfterSolutions.AfterSolution", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<DateTime>("CreatedAt"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<int?>("MainFileId"); + + b.Property<int>("SolutionExerciseReleaseId"); + + b.Property<int>("SolutionPLangId"); + + b.Property<int>("SolutionUserId"); + + b.HasKey("Id"); + + b.HasIndex("MainFileId") + .IsUnique(); + + b.HasIndex("SolutionUserId", "SolutionExerciseReleaseId", "SolutionPLangId") + .IsUnique(); + + b.ToTable("AfterSolutions"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.AfterSolutions.AfterSolutionFile", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<int>("AfterSolutionId"); + + b.Property<string>("Content") + .HasMaxLength(10000); + + b.Property<DateTime>("CreatedAt"); + + b.Property<int>("DisplayIndex"); + + b.Property<string>("FileNameWithExtension") + .HasMaxLength(500); + + b.Property<bool>("IsDisplayed"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<int?>("TemplateFileId"); + + b.HasKey("Id"); + + b.HasIndex("AfterSolutionId"); + + b.HasIndex("TemplateFileId"); + + b.ToTable("AfterSolutionFiles"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.AfterSolutions.CustomTestWithAfterSolutionAsTestResult", b => + { + b.Property<int>("CustomTestId"); + + b.Property<int>("AfterSolutionId"); + + b.Property<int?>("CompileTimeoutInMsUsed"); + + b.Property<DateTime>("CreatedAt"); + + b.Property<bool?>("HasCompiled"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<bool?>("Passed"); + + b.Property<int?>("ProgramExitCode"); + + b.Property<string>("Protocol") + .HasMaxLength(10000); + + b.Property<string>("RunnerVersion") + .HasMaxLength(500); + + b.Property<int?>("TestResultCode"); + + b.Property<string>("TestServerVersion") + .HasMaxLength(500); + + b.Property<int?>("TimeForCompiling"); + + b.Property<int?>("TimeForUserProgram"); + + b.Property<int?>("TimeoutInMsUsed"); + + b.HasKey("CustomTestId", "AfterSolutionId"); + + b.HasIndex("AfterSolutionId"); + + b.HasIndex("CustomTestId"); + + b.ToTable("CustomTestWithAfterSolutionAsTestResults"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.AfterSolutions.TestWithAfterSolutionAsTestResult", b => + { + b.Property<int>("TestId"); + + b.Property<int>("AfterSolutionId"); + + b.Property<int?>("CompileTimeoutInMsUsed"); + + b.Property<DateTime>("CreatedAt"); + + b.Property<bool?>("HasCompiled"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<bool?>("Passed"); + + b.Property<int?>("ProgramExitCode"); + + b.Property<string>("Protocol") + .HasMaxLength(10000); + + b.Property<string>("RunnerVersion") + .HasMaxLength(500); + + b.Property<int?>("TestResultCode"); + + b.Property<string>("TestServerVersion") + .HasMaxLength(500); + + b.Property<int?>("TimeForCompiling"); + + b.Property<int?>("TimeForUserProgram"); + + b.Property<int?>("TimeoutInMsUsed"); + + b.HasKey("TestId", "AfterSolutionId"); + + b.HasIndex("AfterSolutionId"); + + b.HasIndex("TestId"); + + b.ToTable("TestWithAfterSolutionAsTestResults"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Asset", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<string>("AssetUrl") + .HasMaxLength(500); + + b.Property<byte[]>("Content"); + + b.Property<DateTime>("CreatedAt"); + + b.Property<int?>("CustomProjectDescriptionId"); + + b.Property<string>("DisplayName") + .HasMaxLength(500); + + b.Property<int?>("ExerciseDescriptionId") + .IsRequired(); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<string>("MimeType") + .HasMaxLength(500); + + b.HasKey("Id"); + + b.HasIndex("CustomProjectDescriptionId"); + + b.HasIndex("ExerciseDescriptionId"); + + b.ToTable("Assets"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.CodeTemplate", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<DateTime>("CreatedAt"); + + b.Property<int>("ExerciseId"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<int?>("MainFileId"); + + b.Property<int>("PLangId"); + + b.HasKey("Id"); + + b.HasIndex("ExerciseId"); + + b.HasIndex("MainFileId") + .IsUnique(); + + b.HasIndex("PLangId"); + + b.ToTable("Templates"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.CustomTestWithFileAsAssetReference", b => + { + b.Property<int>("CustomTestId"); + + b.Property<int>("FileReferenceUserFileAssetId"); + + b.HasKey("CustomTestId", "FileReferenceUserFileAssetId"); + + b.HasIndex("CustomTestId"); + + b.HasIndex("FileReferenceUserFileAssetId"); + + b.ToTable("CustomTestWithFileAsAssetReferences"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Exercise", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<bool>("CanUserCreateCustomTests"); + + b.Property<bool>("CanUserCreateFiles"); + + b.Property<DateTime>("CreatedAt"); + + b.Property<string>("DisplayName") + .HasMaxLength(500); + + b.Property<bool>("IsOnlyVisibleToOwner"); + + b.Property<bool>("IsPermanentlyLocked"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<string>("Note") + .HasMaxLength(1000); + + b.Property<string>("ShortDescription") + .HasMaxLength(500); + + b.Property<int>("UserGroupId"); + + b.Property<int?>("UserId"); + + b.HasKey("Id"); + + b.HasIndex("UserGroupId"); + + b.HasIndex("UserId"); + + b.ToTable("Exercises"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.ExerciseDescription", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<string>("Content") + .HasMaxLength(10000); + + b.Property<DateTime>("CreatedAt"); + + b.Property<int>("ExerciseId"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.HasKey("Id"); + + b.HasIndex("ExerciseId") + .IsUnique(); + + b.ToTable("ExerciseDescriptions"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.ExerciseDescriptionWithFileAsAssetReference", b => + { + b.Property<int>("ExerciseDescriptionId"); + + b.Property<int>("FileReferenceMarkdownAssetId"); + + b.HasKey("ExerciseDescriptionId", "FileReferenceMarkdownAssetId"); + + b.HasIndex("ExerciseDescriptionId"); + + b.HasIndex("FileReferenceMarkdownAssetId"); + + b.ToTable("ExerciseDescriptionWithFileAsAssetReferences"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.MetaData", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<DateTime>("CreatedAt"); + + b.Property<int>("ExerciseId"); + + b.Property<int?>("ExerciseId1"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.HasKey("Id"); + + b.HasIndex("ExerciseId") + .IsUnique(); + + b.HasIndex("ExerciseId1"); + + b.ToTable("MetaDatas"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Release.ExerciseRelease", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<DateTime?>("AutomaticEndAt"); + + b.Property<DateTime?>("AutomaticStartAt"); + + b.Property<int>("AvailableWorkingTimeInMinutes"); + + b.Property<DateTime>("CreatedAt"); + + b.Property<int>("ExerciseId"); + + b.Property<string>("GeneratedCode") + .IsRequired() + .HasMaxLength(500); + + b.Property<bool>("HadAutomaticAssessmentErrors"); + + b.Property<bool>("HasAutomaticAssessmentFinished"); + + b.Property<bool>("HasAutomaticAssessmentStarted"); + + b.Property<bool>("HasLimitedWorkingTime"); + + b.Property<bool>("HideExerciseLeaveActions"); + + b.Property<bool>("HideInOverviews"); + + b.Property<bool>("HidePrintOptions"); + + b.Property<bool>("HideSiteHeaderBar"); + + b.Property<bool>("IsReleased"); + + b.Property<bool>("IsVisibleToAllAfterRelease"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<int?>("MaxManualPoint"); + + b.Property<string>("Note") + .HasMaxLength(1000); + + b.Property<int>("PLangId"); + + b.Property<int>("ReleaseDurationType"); + + b.Property<int>("ReleaseStartType"); + + b.Property<DateTime?>("ReleasedAt"); + + b.Property<bool>("RunAlsoNormalTests"); + + b.Property<bool>("ShouldAutomaticAssessSubmissions"); + + b.Property<bool>("ShouldClearClipboard"); + + b.Property<bool>("ShowAdditionalLogButton"); + + b.HasKey("Id"); + + b.HasAlternateKey("GeneratedCode") + .HasName("Unique_GeneratedCode"); + + b.HasIndex("ExerciseId"); + + b.HasIndex("PLangId"); + + b.ToTable("ExerciseReleases"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Solution.CustomTestWithSingleSolutionAsTestResult", b => + { + b.Property<int>("CustomTestId"); + + b.Property<int>("SolutionUserId"); + + b.Property<int>("SolutionExerciseReleaseId"); + + b.Property<int>("SolutionPLangId"); + + b.Property<int?>("CompileTimeoutInMsUsed"); + + b.Property<DateTime>("CreatedAt"); + + b.Property<bool?>("HasCompiled"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<bool?>("Passed"); + + b.Property<int?>("ProgramExitCode"); + + b.Property<string>("Protocol") + .HasMaxLength(10000); + + b.Property<string>("RunnerVersion") + .HasMaxLength(500); + + b.Property<int?>("TestResultCode"); + + b.Property<string>("TestServerVersion") + .HasMaxLength(500); + + b.Property<int?>("TimeForCompiling"); + + b.Property<int?>("TimeForUserProgram"); + + b.Property<int?>("TimeoutInMsUsed"); + + b.HasKey("CustomTestId", "SolutionUserId", "SolutionExerciseReleaseId", "SolutionPLangId"); + + b.HasIndex("CustomTestId"); + + b.HasIndex("SolutionUserId", "SolutionExerciseReleaseId", "SolutionPLangId"); + + b.ToTable("CustomTestWithSingleSolutionAsTestResult"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Solution.ExerciseReleaseWithUserAsParticipation", b => + { + b.Property<int>("UserId"); + + b.Property<int>("ExerciseReleaseId"); + + b.Property<DateTime>("CreatedAt"); + + b.Property<int>("LastEditedPLangId"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<bool>("LockSolutionsFlag"); + + b.Property<bool>("ShouldNotCount"); + + b.HasKey("UserId", "ExerciseReleaseId"); + + b.HasIndex("ExerciseReleaseId"); + + b.HasIndex("LastEditedPLangId"); + + b.HasIndex("UserId"); + + b.ToTable("ExerciseReleaseWithUserAsParticipations"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Solution.Solution", b => + { + b.Property<int>("UserId"); + + b.Property<int>("ExerciseReleaseId"); + + b.Property<int>("PLangId"); + + b.Property<int?>("AssessmentId"); + + b.Property<DateTime>("CreatedAt"); + + b.Property<string>("LastEditingIpAddress") + .HasMaxLength(500); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<int?>("MainFileId"); + + b.Property<string>("Note") + .HasMaxLength(1000); + + b.HasKey("UserId", "ExerciseReleaseId", "PLangId"); + + b.HasIndex("AssessmentId") + .IsUnique(); + + b.HasIndex("MainFileId") + .IsUnique(); + + b.HasIndex("PLangId"); + + b.HasIndex("UserId", "ExerciseReleaseId"); + + b.ToTable("Solutions"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Solution.SolutionAssessment", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<string>("FeedbackForStudent") + .HasMaxLength(1000); + + b.Property<string>("LastAssessmentErrorMessage") + .HasMaxLength(5000); + + b.Property<int?>("ManualPoints"); + + b.Property<int>("MaxNormalTestPoints"); + + b.Property<int>("MaxSubmitTestPoints"); + + b.Property<int?>("NormalTestPoints"); + + b.Property<string>("NoteForOtherTutors") + .HasMaxLength(1000); + + b.Property<int?>("SubmitTestPoints"); + + b.HasKey("Id"); + + b.ToTable("SolutionAssessment"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Solution.SolutionFile", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<string>("Content") + .HasMaxLength(10000); + + b.Property<DateTime>("CreatedAt"); + + b.Property<int>("DisplayIndex"); + + b.Property<string>("FileNameWithExtension") + .HasMaxLength(500); + + b.Property<bool>("IsDisplayed"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<int>("SolutionExerciseReleaseId"); + + b.Property<int>("SolutionPLangId"); + + b.Property<int>("SolutionUserId"); + + b.Property<int?>("TemplateFileId"); + + b.HasKey("Id"); + + b.HasIndex("TemplateFileId"); + + b.HasIndex("SolutionUserId", "SolutionExerciseReleaseId", "SolutionPLangId"); + + b.ToTable("SolutionFiles"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Solution.TestWithSingleSolutionAsTestResult", b => + { + b.Property<int>("TestId"); + + b.Property<int>("SolutionUserId"); + + b.Property<int>("SolutionExerciseReleaseId"); + + b.Property<int>("SolutionPLangId"); + + b.Property<int?>("CompileTimeoutInMsUsed"); + + b.Property<DateTime>("CreatedAt"); + + b.Property<bool?>("HasCompiled"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<bool?>("Passed"); + + b.Property<int?>("ProgramExitCode"); + + b.Property<string>("Protocol") + .HasMaxLength(10000); + + b.Property<string>("RunnerVersion") + .HasMaxLength(500); + + b.Property<int?>("TestResultCode"); + + b.Property<string>("TestServerVersion") + .HasMaxLength(500); + + b.Property<int?>("TimeForCompiling"); + + b.Property<int?>("TimeForUserProgram"); + + b.Property<int?>("TimeoutInMsUsed"); + + b.HasKey("TestId", "SolutionUserId", "SolutionExerciseReleaseId", "SolutionPLangId"); + + b.HasIndex("TestId"); + + b.HasIndex("SolutionUserId", "SolutionExerciseReleaseId", "SolutionPLangId"); + + b.ToTable("TestWithSingleSolutionAsTestResult"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Tag", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<DateTime>("CreatedAt"); + + b.Property<string>("Description") + .HasMaxLength(500); + + b.Property<string>("DisplayName") + .HasMaxLength(500); + + b.Property<string>("HtmlBackgroundColor") + .HasMaxLength(500); + + b.Property<string>("HtmlColor") + .HasMaxLength(500); + + b.Property<string>("HtmlIcon") + .HasMaxLength(500); + + b.Property<DateTime>("LastUpdatedAt"); + + b.HasKey("Id"); + + b.HasIndex("DisplayName") + .HasName("Unique_Tag"); + + b.ToTable("Tags"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.TagWithMetaData", b => + { + b.Property<int>("TagId"); + + b.Property<int>("MetaDataId"); + + b.Property<DateTime>("CreatedAt"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.HasKey("TagId", "MetaDataId"); + + b.HasIndex("MetaDataId"); + + b.HasIndex("TagId"); + + b.ToTable("TagWithMetaDatas"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.TemplateFile", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<int?>("CodeTemplateId") + .IsRequired(); + + b.Property<string>("Content") + .HasMaxLength(10000); + + b.Property<DateTime>("CreatedAt"); + + b.Property<int>("DisplayIndex"); + + b.Property<string>("FileNameWithExtension") + .HasMaxLength(500); + + b.Property<bool>("IsContentVisibleForUser"); + + b.Property<bool>("IsEditableByUser"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.HasKey("Id"); + + b.HasIndex("CodeTemplateId"); + + b.ToTable("TemplateFiles"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Tests.CustomTest", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<string>("Content") + .HasMaxLength(5000); + + b.Property<DateTime>("CreatedAt"); + + b.Property<int>("DisplayIndex"); + + b.Property<string>("DisplayName") + .HasMaxLength(500); + + b.Property<int>("ExerciseReleaseId"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<int>("TestTypeId"); + + b.Property<int>("UserId"); + + b.HasKey("Id"); + + b.HasIndex("TestTypeId"); + + b.HasIndex("UserId", "ExerciseReleaseId"); + + b.ToTable("CustomTest"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Tests.CustomTestAsset", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<byte[]>("Content"); + + b.Property<DateTime>("CreatedAt"); + + b.Property<int?>("CustomTestId") + .IsRequired(); + + b.Property<string>("DisplayName") + .HasMaxLength(500); + + b.Property<string>("Hash") + .HasMaxLength(500); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<string>("MimeType") + .HasMaxLength(500); + + b.HasKey("Id"); + + b.HasIndex("CustomTestId"); + + b.ToTable("CustomTestAssets"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Tests.DefaultCustomTestSettings", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<int>("CompileTimeoutInMs"); + + b.Property<string>("CompilerOptions") + .HasMaxLength(500); + + b.Property<DateTime>("CreatedAt"); + + b.Property<int>("ExerciseId"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<int>("MaxDiskSpaceInKb"); + + b.Property<int>("MemoryLimitInKb"); + + b.Property<int>("TimeoutInMs"); + + b.HasKey("Id"); + + b.HasIndex("ExerciseId") + .IsUnique(); + + b.ToTable("DefaultCustomTestSettings"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Tests.Test", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<string>("Content") + .HasMaxLength(5000); + + b.Property<DateTime>("CreatedAt"); + + b.Property<int>("DisplayIndex"); + + b.Property<string>("DisplayName") + .HasMaxLength(500); + + b.Property<int>("ExerciseId"); + + b.Property<bool>("IsSubmitTest"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<int>("TestSettingsId"); + + b.Property<int>("TestTypeId"); + + b.Property<int>("Weight"); + + b.HasKey("Id"); + + b.HasIndex("ExerciseId"); + + b.HasIndex("TestSettingsId") + .IsUnique(); + + b.HasIndex("TestTypeId"); + + b.ToTable("Tests"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Tests.TestAsset", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<byte[]>("Content"); + + b.Property<DateTime>("CreatedAt"); + + b.Property<string>("DisplayName") + .HasMaxLength(500); + + b.Property<string>("Hash") + .HasMaxLength(500); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<string>("MimeType") + .HasMaxLength(500); + + b.Property<int?>("TestId") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("TestId"); + + b.ToTable("TestAssets"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Tests.TestSettings", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<int>("CompileTimeoutInMs"); + + b.Property<string>("CompilerOptions") + .HasMaxLength(500); + + b.Property<DateTime>("CreatedAt"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<int>("MaxDiskSpaceInKb"); + + b.Property<int>("MemoryLimitInKb"); + + b.Property<int>("TimeoutInMs"); + + b.HasKey("Id"); + + b.ToTable("TestCaseSettingses"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Tests.TestType", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<DateTime>("CreatedAt"); + + b.Property<string>("DisplayName") + .HasMaxLength(500); + + b.Property<string>("InternalName") + .HasMaxLength(500); + + b.Property<DateTime>("LastUpdatedAt"); + + b.HasKey("Id"); + + b.ToTable("TestTypes"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.TestWithFileAsAssetReference", b => + { + b.Property<int>("TestId"); + + b.Property<int>("FileReferenceTestAssetId"); + + b.HasKey("TestId", "FileReferenceTestAssetId"); + + b.HasIndex("FileReferenceTestAssetId"); + + b.HasIndex("TestId"); + + b.ToTable("TestWithFileAsAssetReferences"); + }); + + modelBuilder.Entity("ClientServer.Models.Files.FileReferenceMarkdownAsset", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<DateTime>("CreatedAt"); + + b.Property<string>("Hash") + .HasMaxLength(500); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<string>("MimeType") + .HasMaxLength(500); + + b.Property<string>("OriginalName") + .HasMaxLength(500); + + b.Property<long>("SizeInBytes"); + + b.HasKey("Id"); + + b.ToTable("FileReferenceMarkdownAssets"); + }); + + modelBuilder.Entity("ClientServer.Models.Files.FileReferenceTestAsset", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<DateTime>("CreatedAt"); + + b.Property<string>("Hash") + .HasMaxLength(500); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<string>("MimeType") + .HasMaxLength(500); + + b.Property<string>("OriginalName") + .HasMaxLength(500); + + b.Property<long>("SizeInBytes"); + + b.HasKey("Id"); + + b.ToTable("FileReferenceTestAssets"); + }); + + modelBuilder.Entity("ClientServer.Models.Files.FileReferenceUserFileAsset", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<DateTime>("CreatedAt"); + + b.Property<string>("Hash") + .HasMaxLength(500); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<string>("MimeType") + .HasMaxLength(500); + + b.Property<string>("OriginalName") + .HasMaxLength(500); + + b.Property<long>("SizeInBytes"); + + b.HasKey("Id"); + + b.ToTable("FileReferenceUserFileAssets"); + }); + + modelBuilder.Entity("ClientServer.Models.Lang", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<DateTime>("CreatedAt"); + + b.Property<string>("LangShortcut") + .HasMaxLength(500); + + b.Property<string>("Language") + .HasMaxLength(500); + + b.Property<DateTime>("LastUpdatedAt"); + + b.HasKey("Id"); + + b.ToTable("Langs"); + }); + + modelBuilder.Entity("ClientServer.Models.PLang", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<DateTime>("CreatedAt"); + + b.Property<string>("DisplayName") + .HasMaxLength(500); + + b.Property<string>("EditorHighlightModeName") + .HasMaxLength(500); + + b.Property<string>("FileExtensionsWithDot") + .HasMaxLength(500); + + b.Property<string>("InternalName") + .HasMaxLength(500); + + b.Property<DateTime>("LastUpdatedAt"); + + b.HasKey("Id"); + + b.ToTable("PLangs"); + }); + + modelBuilder.Entity("ClientServer.Models.Users.AuthToken", b => + { + b.Property<int>("UserId"); + + b.Property<DateTime>("CreatedAt"); + + b.Property<string>("CsrfToken") + .HasMaxLength(500); + + b.Property<DateTime>("ExpirationDateTime"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<string>("RandomSecret") + .HasMaxLength(500); + + b.Property<string>("UserAuthToken") + .HasMaxLength(500); + + b.HasKey("UserId"); + + b.HasIndex("UserAuthToken") + .IsUnique(); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("AuthTokens"); + }); + + modelBuilder.Entity("ClientServer.Models.Users.ExternalUser", b => + { + b.Property<int>("ExternalId") + .ValueGeneratedOnAdd(); + + b.Property<DateTime>("CreatedAt"); + + b.Property<string>("Email") + .HasMaxLength(500); + + b.Property<string>("FirstName") + .HasMaxLength(500); + + b.Property<string>("LastName") + .HasMaxLength(500); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<bool>("NeedToRefreshData"); + + b.Property<string>("Token") + .IsRequired() + .HasMaxLength(500); + + b.Property<int>("UserId"); + + b.HasKey("ExternalId"); + + b.HasAlternateKey("Token") + .HasName("Unique_ExternalToken"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("ExternalUsers"); + }); + + modelBuilder.Entity("ClientServer.Models.Users.GroupRole", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<DateTime>("CreatedAt"); + + b.Property<string>("DisplayName") + .HasMaxLength(500); + + b.Property<int>("GroupRolePermissionId"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.HasKey("Id"); + + b.HasIndex("GroupRolePermissionId") + .IsUnique(); + + b.ToTable("GroupRoles"); + }); + + modelBuilder.Entity("ClientServer.Models.Users.GroupRolePermission", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<bool>("CanAddUserToGroup"); + + b.Property<bool>("CanAssessExercises"); + + b.Property<bool>("CanChangeExercises"); + + b.Property<bool>("CanChangeGroupData"); + + b.Property<bool>("CanChangeOtherMembersRole"); + + b.Property<bool>("CanCreateExercises"); + + b.Property<bool>("CanDeleteExercises"); + + b.Property<bool>("CanLockExercisesPermanently"); + + b.Property<bool>("CanReleaseExercises"); + + b.Property<bool>("CanRemoveMemberFromGroup"); + + b.Property<bool>("CanSeeExercisesFromOthersInGroup"); + + b.Property<bool>("CanSeeOtherMembers"); + + b.Property<DateTime>("CreatedAt"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.HasKey("Id"); + + b.ToTable("GroupRolePermissions"); + }); + + modelBuilder.Entity("ClientServer.Models.Users.Settings.CodeEditorSetting", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<DateTime>("CreatedAt"); + + b.Property<int>("FontSize"); + + b.Property<bool>("HighlightCurrentLine"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<bool>("ShowInvisibles"); + + b.Property<bool>("ShowLineIndentions"); + + b.Property<bool>("ShowLineNumbers"); + + b.Property<int>("TabSize"); + + b.Property<string>("Theme") + .HasMaxLength(500); + + b.Property<bool>("UseWrapping"); + + b.HasKey("Id"); + + b.ToTable("CodeEditorSettings"); + }); + + modelBuilder.Entity("ClientServer.Models.Users.Settings.UserSetting", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<int>("CodeEditorSettingsId"); + + b.Property<DateTime>("CreatedAt"); + + b.Property<int?>("LangId"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<string>("Theme") + .HasMaxLength(500); + + b.Property<int?>("UserId"); + + b.HasKey("Id"); + + b.HasIndex("CodeEditorSettingsId") + .IsUnique(); + + b.HasIndex("LangId"); + + b.HasIndex("UserId") + .IsUnique(); + + b.ToTable("UserSettingses"); + }); + + modelBuilder.Entity("ClientServer.Models.Users.SystemRole", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<DateTime>("CreatedAt"); + + b.Property<string>("DisplayName") + .HasMaxLength(500); + + b.Property<string>("Email") + .HasMaxLength(500); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<int>("SystemRolePermissionId"); + + b.HasKey("Id"); + + b.HasIndex("SystemRolePermissionId") + .IsUnique(); + + b.ToTable("SystemRoles"); + }); + + modelBuilder.Entity("ClientServer.Models.Users.SystemRolePermission", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<bool>("CanChangeOtherUsersSystemRole"); + + b.Property<bool>("CanChangeRoles"); + + b.Property<bool>("CanChangeSystemSettings"); + + b.Property<bool>("CanChangeUserData"); + + b.Property<bool>("CanCreateGroups"); + + b.Property<bool>("CanCreateRoles"); + + b.Property<bool>("CanDeleteActivatedUsers"); + + b.Property<bool>("CanDeleteGroups"); + + b.Property<bool>("CanDeleteRoles"); + + b.Property<bool>("CanManageNewUsers"); + + b.Property<bool>("CanManageTags"); + + b.Property<bool>("CanViewDashboard"); + + b.Property<DateTime>("CreatedAt"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.HasKey("Id"); + + b.ToTable("SystemRolePermissions"); + }); + + modelBuilder.Entity("ClientServer.Models.Users.SystemSetting", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<DateTime>("CreatedAt"); + + b.Property<string>("CurrentServerMessage") + .HasMaxLength(1000); + + b.Property<int>("CustomProjectTestCompileTimeoutInMs"); + + b.Property<int>("CustomProjectTestMaxDiskSpaceInKb"); + + b.Property<int>("CustomProjectTestMemoryLimitInKb"); + + b.Property<int>("CustomProjectTestTimeoutInMs"); + + b.Property<int>("DefaultGroupCreatorGroupRoleId"); + + b.Property<int>("DefaultGroupRoleId"); + + b.Property<int>("DefaultUserGroupId"); + + b.Property<int>("JustRunProgramCompileTimeoutInMs"); + + b.Property<int>("JustRunProgramMaxDiskSpaceInKb"); + + b.Property<int>("JustRunProgramMemoryLimitInKb"); + + b.Property<int>("JustRunProgramTimeoutInMs"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<int>("MaxCustomProjectsPerUser"); + + b.Property<int>("MaxCustomTestsPerParticipation"); + + b.Property<int>("MaxNumberOfTestsWithOneRequest"); + + b.Property<int>("MaxNumberOfTestsWithOneRequestSubmitTestServer"); + + b.Property<int>("SubmitTestServerTimeoutInMs"); + + b.Property<string>("SubmitTestServerUrl") + .HasMaxLength(500); + + b.Property<string>("TestServerConfigUiUrl") + .HasMaxLength(500); + + b.Property<string>("TestServerStatsUrl") + .HasMaxLength(500); + + b.Property<int>("TestServerTimeoutInMs"); + + b.Property<string>("TestServerUrl") + .HasMaxLength(500); + + b.HasKey("Id"); + + b.HasIndex("DefaultGroupCreatorGroupRoleId") + .IsUnique(); + + b.HasIndex("DefaultGroupRoleId") + .IsUnique(); + + b.HasIndex("DefaultUserGroupId") + .IsUnique(); + + b.ToTable("SystemSettings"); + }); + + modelBuilder.Entity("ClientServer.Models.Users.User", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<DateTime>("CreatedAt"); + + b.Property<string>("Email") + .HasMaxLength(500); + + b.Property<string>("FirstName") + .HasMaxLength(500); + + b.Property<bool>("IsActivated"); + + b.Property<DateTime>("LastLoginAt"); + + b.Property<string>("LastName") + .HasMaxLength(500); + + b.Property<DateTime>("LastUpdatedAt"); + + b.Property<string>("Password") + .HasMaxLength(500); + + b.Property<int?>("SystemRoleId"); + + b.Property<string>("Token") + .IsRequired() + .HasMaxLength(500); + + b.HasKey("Id"); + + b.HasAlternateKey("Token") + .HasName("Unique_Token"); + + b.HasIndex("SystemRoleId"); + + b.ToTable("Users"); + }); + + modelBuilder.Entity("ClientServer.Models.Users.UserGroup", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd(); + + b.Property<DateTime>("CreatedAt"); + + b.Property<string>("DisplayName") + .HasMaxLength(500); + + b.Property<string>("Email") + .HasMaxLength(500); + + b.Property<DateTime>("LastUpdatedAt"); + + b.HasKey("Id"); + + b.ToTable("UserGroups"); + }); + + modelBuilder.Entity("ClientServer.Models.Users.UserWithUserGroup", b => + { + b.Property<int>("UserId"); + + b.Property<int>("UserGroupId"); + + b.Property<DateTime>("CreatedAt"); + + b.Property<int>("GroupRoleId"); + + b.Property<DateTime>("LastUpdatedAt"); + + b.HasKey("UserId", "UserGroupId"); + + b.HasIndex("GroupRoleId"); + + b.HasIndex("UserGroupId"); + + b.HasIndex("UserId"); + + b.ToTable("UserWithUserGroups"); + }); + + modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProject", b => + { + b.HasOne("ClientServer.Models.Users.User", "User") + .WithMany("CustomProjects") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectDescription", b => + { + b.HasOne("ClientServer.Models.CustomProjects.CustomProject", "CustomProject") + .WithOne("Description") + .HasForeignKey("ClientServer.Models.CustomProjects.CustomProjectDescription", "CustomProjectId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectDescriptionWithFileAsAssetReference", b => + { + b.HasOne("ClientServer.Models.CustomProjects.CustomProjectDescription", "CustomProjectDescription") + .WithMany("AssetReferences") + .HasForeignKey("CustomProjectDescriptionId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.Files.FileReferenceUserFileAsset", "FileReferenceUserFileAsset") + .WithMany("CustomProjectDescriptionWithFileAsAssetReferences") + .HasForeignKey("FileReferenceUserFileAssetId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectSolution", b => + { + b.HasOne("ClientServer.Models.CustomProjects.CustomProject", "CustomProject") + .WithMany("Solutions") + .HasForeignKey("CustomProjectId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.CustomProjects.CustomProjectSolutionFile", "MainFile") + .WithOne() + .HasForeignKey("ClientServer.Models.CustomProjects.CustomProjectSolution", "MainFileId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("ClientServer.Models.PLang", "PLang") + .WithMany() + .HasForeignKey("PLangId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectSolutionFile", b => + { + b.HasOne("ClientServer.Models.CustomProjects.CustomProjectSolution") + .WithMany("SolutionFiles") + .HasForeignKey("CustomProjectSolutionId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectTest", b => + { + b.HasOne("ClientServer.Models.CustomProjects.CustomProject", "CustomProject") + .WithMany("Tests") + .HasForeignKey("CustomProjectId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.Exercises.Tests.TestSettings", "TestSettings") + .WithOne() + .HasForeignKey("ClientServer.Models.CustomProjects.CustomProjectTest", "TestSettingsId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.Exercises.Tests.TestType", "TestType") + .WithMany() + .HasForeignKey("TestTypeId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectTestAsset", b => + { + b.HasOne("ClientServer.Models.CustomProjects.CustomProjectTest") + .WithMany("TestAssets") + .HasForeignKey("CustomProjectTestId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectTestWithFileAsAssetReference", b => + { + b.HasOne("ClientServer.Models.CustomProjects.CustomProjectTest", "CustomProjectTest") + .WithMany("AssetReferences") + .HasForeignKey("CustomProjectTestId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.Files.FileReferenceUserFileAsset", "FileReferenceUserFileAsset") + .WithMany("CustomProjectTestWithFileAsAssetReferences") + .HasForeignKey("FileReferenceUserFileAssetId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.CustomProjects.CustomProjectTestWithSolutionAsTestResult", b => + { + b.HasOne("ClientServer.Models.CustomProjects.CustomProjectSolution", "CustomProjectSolution") + .WithMany("TestResults") + .HasForeignKey("CustomProjectSolutionId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.CustomProjects.CustomProjectTest", "CustomProjectTest") + .WithMany("TestResults") + .HasForeignKey("CustomProjectTestId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.AfterSolutions.AfterSolution", b => + { + b.HasOne("ClientServer.Models.Exercises.AfterSolutions.AfterSolutionFile", "MainFile") + .WithOne() + .HasForeignKey("ClientServer.Models.Exercises.AfterSolutions.AfterSolution", "MainFileId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("ClientServer.Models.Exercises.Solution.Solution", "Solution") + .WithOne("AfterSolution") + .HasForeignKey("ClientServer.Models.Exercises.AfterSolutions.AfterSolution", "SolutionUserId", "SolutionExerciseReleaseId", "SolutionPLangId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.AfterSolutions.AfterSolutionFile", b => + { + b.HasOne("ClientServer.Models.Exercises.AfterSolutions.AfterSolution", "AfterSolution") + .WithMany("SolutionFiles") + .HasForeignKey("AfterSolutionId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.Exercises.TemplateFile", "TemplateFile") + .WithMany() + .HasForeignKey("TemplateFileId"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.AfterSolutions.CustomTestWithAfterSolutionAsTestResult", b => + { + b.HasOne("ClientServer.Models.Exercises.AfterSolutions.AfterSolution", "AfterSolution") + .WithMany("CustomTestResults") + .HasForeignKey("AfterSolutionId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.Exercises.Tests.CustomTest", "CustomTest") + .WithMany("AfterTestResults") + .HasForeignKey("CustomTestId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.AfterSolutions.TestWithAfterSolutionAsTestResult", b => + { + b.HasOne("ClientServer.Models.Exercises.AfterSolutions.AfterSolution", "AfterSolution") + .WithMany("TestResults") + .HasForeignKey("AfterSolutionId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.Exercises.Tests.Test", "Test") + .WithMany("AfterTestResults") + .HasForeignKey("TestId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Asset", b => + { + b.HasOne("ClientServer.Models.CustomProjects.CustomProjectDescription") + .WithMany("Assets") + .HasForeignKey("CustomProjectDescriptionId"); + + b.HasOne("ClientServer.Models.Exercises.ExerciseDescription") + .WithMany("Assets") + .HasForeignKey("ExerciseDescriptionId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.CodeTemplate", b => + { + b.HasOne("ClientServer.Models.Exercises.Exercise", "Exercise") + .WithMany("CodeTemplates") + .HasForeignKey("ExerciseId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.Exercises.TemplateFile", "MainFile") + .WithOne() + .HasForeignKey("ClientServer.Models.Exercises.CodeTemplate", "MainFileId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("ClientServer.Models.PLang", "PLang") + .WithMany() + .HasForeignKey("PLangId"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.CustomTestWithFileAsAssetReference", b => + { + b.HasOne("ClientServer.Models.Exercises.Tests.CustomTest", "CustomTest") + .WithMany("AssetReferences") + .HasForeignKey("CustomTestId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.Files.FileReferenceUserFileAsset", "FileReferenceUserFileAsset") + .WithMany("CustomTestWithFileAsAssetReferences") + .HasForeignKey("FileReferenceUserFileAssetId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Exercise", b => + { + b.HasOne("ClientServer.Models.Users.UserGroup", "UserGroup") + .WithMany("Exercises") + .HasForeignKey("UserGroupId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.Users.User", "User") + .WithMany("Exercises") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.SetNull); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.ExerciseDescription", b => + { + b.HasOne("ClientServer.Models.Exercises.Exercise", "Exercise") + .WithOne("Description") + .HasForeignKey("ClientServer.Models.Exercises.ExerciseDescription", "ExerciseId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.ExerciseDescriptionWithFileAsAssetReference", b => + { + b.HasOne("ClientServer.Models.Exercises.ExerciseDescription", "ExerciseDescription") + .WithMany("AssetReferences") + .HasForeignKey("ExerciseDescriptionId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.Files.FileReferenceMarkdownAsset", "FileReferenceMarkdownAsset") + .WithMany("AssetReferences") + .HasForeignKey("FileReferenceMarkdownAssetId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.MetaData", b => + { + b.HasOne("ClientServer.Models.Exercises.Exercise") + .WithOne("MetaData") + .HasForeignKey("ClientServer.Models.Exercises.MetaData", "ExerciseId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.Exercises.Exercise", "Exercise") + .WithMany() + .HasForeignKey("ExerciseId1"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Release.ExerciseRelease", b => + { + b.HasOne("ClientServer.Models.Exercises.Exercise", "Exercise") + .WithMany("Releases") + .HasForeignKey("ExerciseId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.PLang", "PLang") + .WithMany() + .HasForeignKey("PLangId"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Solution.CustomTestWithSingleSolutionAsTestResult", b => + { + b.HasOne("ClientServer.Models.Exercises.Tests.CustomTest", "CustomTest") + .WithMany("TestResultsNew") + .HasForeignKey("CustomTestId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.Exercises.Solution.Solution", "Solution") + .WithMany("CustomTestResults") + .HasForeignKey("SolutionUserId", "SolutionExerciseReleaseId", "SolutionPLangId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Solution.ExerciseReleaseWithUserAsParticipation", b => + { + b.HasOne("ClientServer.Models.Exercises.Release.ExerciseRelease", "ExerciseRelease") + .WithMany("ExerciseReleaseWithUserAsParticipations") + .HasForeignKey("ExerciseReleaseId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.PLang", "LastEditedPLang") + .WithMany() + .HasForeignKey("LastEditedPLangId"); + + b.HasOne("ClientServer.Models.Users.User", "User") + .WithMany("ExerciseReleaseWithUserAsParticipations") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Solution.Solution", b => + { + b.HasOne("ClientServer.Models.Exercises.Solution.SolutionAssessment", "Assessment") + .WithOne("Solution") + .HasForeignKey("ClientServer.Models.Exercises.Solution.Solution", "AssessmentId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.Exercises.Solution.SolutionFile", "MainFile") + .WithOne() + .HasForeignKey("ClientServer.Models.Exercises.Solution.Solution", "MainFileId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("ClientServer.Models.PLang", "PLang") + .WithMany() + .HasForeignKey("PLangId"); + + b.HasOne("ClientServer.Models.Exercises.Solution.ExerciseReleaseWithUserAsParticipation", "ExerciseReleaseWithUserAsParticipation") + .WithMany("Solutions") + .HasForeignKey("UserId", "ExerciseReleaseId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Solution.SolutionFile", b => + { + b.HasOne("ClientServer.Models.Exercises.TemplateFile", "TemplateFile") + .WithMany("SolutionParts") + .HasForeignKey("TemplateFileId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("ClientServer.Models.Exercises.Solution.Solution", "Solution") + .WithMany("SolutionFiles") + .HasForeignKey("SolutionUserId", "SolutionExerciseReleaseId", "SolutionPLangId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Solution.TestWithSingleSolutionAsTestResult", b => + { + b.HasOne("ClientServer.Models.Exercises.Tests.Test", "Test") + .WithMany("TestResultsNew") + .HasForeignKey("TestId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.Exercises.Solution.Solution", "Solution") + .WithMany("TestResults") + .HasForeignKey("SolutionUserId", "SolutionExerciseReleaseId", "SolutionPLangId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.TagWithMetaData", b => + { + b.HasOne("ClientServer.Models.Exercises.MetaData", "MetaData") + .WithMany("TagWithMetaDatas") + .HasForeignKey("MetaDataId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.Exercises.Tag", "Tag") + .WithMany() + .HasForeignKey("TagId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.TemplateFile", b => + { + b.HasOne("ClientServer.Models.Exercises.CodeTemplate") + .WithMany("TemplateFiles") + .HasForeignKey("CodeTemplateId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Tests.CustomTest", b => + { + b.HasOne("ClientServer.Models.Exercises.Tests.TestType", "TestType") + .WithMany() + .HasForeignKey("TestTypeId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.Exercises.Solution.ExerciseReleaseWithUserAsParticipation") + .WithMany("CustomTests") + .HasForeignKey("UserId", "ExerciseReleaseId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Tests.CustomTestAsset", b => + { + b.HasOne("ClientServer.Models.Exercises.Tests.CustomTest") + .WithMany("TestAssets") + .HasForeignKey("CustomTestId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Tests.DefaultCustomTestSettings", b => + { + b.HasOne("ClientServer.Models.Exercises.Exercise", "Exercise") + .WithOne("DefaultCustomTestSettings") + .HasForeignKey("ClientServer.Models.Exercises.Tests.DefaultCustomTestSettings", "ExerciseId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Tests.Test", b => + { + b.HasOne("ClientServer.Models.Exercises.Exercise", "Exercise") + .WithMany("Tests") + .HasForeignKey("ExerciseId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.Exercises.Tests.TestSettings", "TestSettings") + .WithOne() + .HasForeignKey("ClientServer.Models.Exercises.Tests.Test", "TestSettingsId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.Exercises.Tests.TestType", "TestType") + .WithMany() + .HasForeignKey("TestTypeId"); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.Tests.TestAsset", b => + { + b.HasOne("ClientServer.Models.Exercises.Tests.Test") + .WithMany("TestAssets") + .HasForeignKey("TestId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Exercises.TestWithFileAsAssetReference", b => + { + b.HasOne("ClientServer.Models.Files.FileReferenceTestAsset", "FileReferenceTestAsset") + .WithMany("AssetReferences") + .HasForeignKey("FileReferenceTestAssetId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.Exercises.Tests.Test", "Test") + .WithMany("AssetReferences") + .HasForeignKey("TestId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Users.AuthToken", b => + { + b.HasOne("ClientServer.Models.Users.User", "User") + .WithOne() + .HasForeignKey("ClientServer.Models.Users.AuthToken", "UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Users.ExternalUser", b => + { + b.HasOne("ClientServer.Models.Users.User", "User") + .WithOne("ExternalUser") + .HasForeignKey("ClientServer.Models.Users.ExternalUser", "UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Users.GroupRole", b => + { + b.HasOne("ClientServer.Models.Users.GroupRolePermission", "GroupRolePermission") + .WithOne() + .HasForeignKey("ClientServer.Models.Users.GroupRole", "GroupRolePermissionId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Users.Settings.UserSetting", b => + { + b.HasOne("ClientServer.Models.Users.Settings.CodeEditorSetting", "CodeEditorSetting") + .WithOne() + .HasForeignKey("ClientServer.Models.Users.Settings.UserSetting", "CodeEditorSettingsId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.Lang", "Lang") + .WithMany() + .HasForeignKey("LangId") + .OnDelete(DeleteBehavior.SetNull); + + b.HasOne("ClientServer.Models.Users.User", "User") + .WithOne("UserSettings") + .HasForeignKey("ClientServer.Models.Users.Settings.UserSetting", "UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Users.SystemRole", b => + { + b.HasOne("ClientServer.Models.Users.SystemRolePermission", "SystemRolePermission") + .WithOne() + .HasForeignKey("ClientServer.Models.Users.SystemRole", "SystemRolePermissionId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ClientServer.Models.Users.SystemSetting", b => + { + b.HasOne("ClientServer.Models.Users.GroupRole", "DefaultGroupCreatorGroupRole") + .WithOne() + .HasForeignKey("ClientServer.Models.Users.SystemSetting", "DefaultGroupCreatorGroupRoleId"); + + b.HasOne("ClientServer.Models.Users.GroupRole", "DefaultGroupRole") + .WithOne() + .HasForeignKey("ClientServer.Models.Users.SystemSetting", "DefaultGroupRoleId"); + + b.HasOne("ClientServer.Models.Users.UserGroup", "DefaultUserGroup") + .WithOne() + .HasForeignKey("ClientServer.Models.Users.SystemSetting", "DefaultUserGroupId"); + }); + + modelBuilder.Entity("ClientServer.Models.Users.User", b => + { + b.HasOne("ClientServer.Models.Users.SystemRole", "SystemRole") + .WithMany() + .HasForeignKey("SystemRoleId") + .OnDelete(DeleteBehavior.SetNull); + }); + + modelBuilder.Entity("ClientServer.Models.Users.UserWithUserGroup", b => + { + b.HasOne("ClientServer.Models.Users.GroupRole", "GroupRole") + .WithMany("UserUserGroups") + .HasForeignKey("GroupRoleId"); + + b.HasOne("ClientServer.Models.Users.UserGroup", "UserGroup") + .WithMany("UserWithUserGroups") + .HasForeignKey("UserGroupId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ClientServer.Models.Users.User", "User") + .WithMany("UserWithUserGroups") + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + } + } +} diff --git a/src/ClientServer/Migrations/20190606164356_RemoveAssetPathsAddedCompilerOptions.cs b/src/ClientServer/Migrations/20190606164356_RemoveAssetPathsAddedCompilerOptions.cs new file mode 100755 index 0000000000000000000000000000000000000000..27c7a57b56916fe0126a4afa3e95d8336151be65 --- /dev/null +++ b/src/ClientServer/Migrations/20190606164356_RemoveAssetPathsAddedCompilerOptions.cs @@ -0,0 +1,65 @@ +using System; +using System.Collections.Generic; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace ClientServer.Migrations +{ + public partial class RemoveAssetPathsAddedCompilerOptions : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "RelativePath", + table: "FileReferenceUserFileAssets"); + + migrationBuilder.DropColumn( + name: "RelativePath", + table: "FileReferenceTestAssets"); + + migrationBuilder.DropColumn( + name: "RelativePath", + table: "FileReferenceMarkdownAssets"); + + migrationBuilder.AddColumn<string>( + name: "CompilerOptions", + table: "TestCaseSettingses", + maxLength: 500, + nullable: true); + + migrationBuilder.AddColumn<string>( + name: "CompilerOptions", + table: "DefaultCustomTestSettings", + maxLength: 500, + nullable: true); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "CompilerOptions", + table: "TestCaseSettingses"); + + migrationBuilder.DropColumn( + name: "CompilerOptions", + table: "DefaultCustomTestSettings"); + + migrationBuilder.AddColumn<string>( + name: "RelativePath", + table: "FileReferenceUserFileAssets", + maxLength: 5000, + nullable: true); + + migrationBuilder.AddColumn<string>( + name: "RelativePath", + table: "FileReferenceTestAssets", + maxLength: 5000, + nullable: true); + + migrationBuilder.AddColumn<string>( + name: "RelativePath", + table: "FileReferenceMarkdownAssets", + maxLength: 5000, + nullable: true); + } + } +} diff --git a/src/ClientServer/Migrations/SyndromDbContextModelSnapshot.cs b/src/ClientServer/Migrations/SyndromDbContextModelSnapshot.cs index 206509ef48da8360caf9c54bf3a8769344279b31..d2e05915d526814733728d0a8e63c7c1748c341d 100644 --- a/src/ClientServer/Migrations/SyndromDbContextModelSnapshot.cs +++ b/src/ClientServer/Migrations/SyndromDbContextModelSnapshot.cs @@ -1041,6 +1041,9 @@ namespace ClientServer.Migrations b.Property<int>("CompileTimeoutInMs"); + b.Property<string>("CompilerOptions") + .HasMaxLength(500); + b.Property<DateTime>("CreatedAt"); b.Property<int>("ExerciseId"); @@ -1137,6 +1140,9 @@ namespace ClientServer.Migrations b.Property<int>("CompileTimeoutInMs"); + b.Property<string>("CompilerOptions") + .HasMaxLength(500); + b.Property<DateTime>("CreatedAt"); b.Property<DateTime>("LastUpdatedAt"); @@ -1205,9 +1211,6 @@ namespace ClientServer.Migrations b.Property<string>("OriginalName") .HasMaxLength(500); - b.Property<string>("RelativePath") - .HasMaxLength(5000); - b.Property<long>("SizeInBytes"); b.HasKey("Id"); @@ -1233,9 +1236,6 @@ namespace ClientServer.Migrations b.Property<string>("OriginalName") .HasMaxLength(500); - b.Property<string>("RelativePath") - .HasMaxLength(5000); - b.Property<long>("SizeInBytes"); b.HasKey("Id"); @@ -1261,9 +1261,6 @@ namespace ClientServer.Migrations b.Property<string>("OriginalName") .HasMaxLength(500); - b.Property<string>("RelativePath") - .HasMaxLength(5000); - b.Property<long>("SizeInBytes"); b.HasKey("Id"); diff --git a/src/ClientServer/Models/Exercises/Tests/DefaultCustomTestSettings.cs b/src/ClientServer/Models/Exercises/Tests/DefaultCustomTestSettings.cs index 70ecc3d4f3dfb51708fe37b06445062c4d20c458..23f8fb85cc274ed8f26138804608e81ee35b0000 100644 --- a/src/ClientServer/Models/Exercises/Tests/DefaultCustomTestSettings.cs +++ b/src/ClientServer/Models/Exercises/Tests/DefaultCustomTestSettings.cs @@ -1,7 +1,9 @@ using System; using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.Linq; using System.Threading.Tasks; +using ClientServer.Db; using ClientServer.Models.Interfaces; namespace ClientServer.Models.Exercises.Tests @@ -31,6 +33,12 @@ namespace ClientServer.Models.Exercises.Tests /// the max amount of disk space the <see cref="Test"/> can write to /// </summary> public int MaxDiskSpaceInKb { get; set; } + + /// <summary> + /// some compiler options .g. -Xlint options needs to be separated by whitespaces (like normal command args) + /// </summary> + [MaxLength(SyndromDbContext.DefaultMaxStringLength)] + public string CompilerOptions { get; set; } public int ExerciseId { get; set; } diff --git a/src/ClientServer/Models/Exercises/Tests/TestSettings.cs b/src/ClientServer/Models/Exercises/Tests/TestSettings.cs index be0a0a86eea206a7ca5383cbde5a6a3f29a74778..9c9c1c54361c99be7ca9fe12b21fe69c249d9a5e 100644 --- a/src/ClientServer/Models/Exercises/Tests/TestSettings.cs +++ b/src/ClientServer/Models/Exercises/Tests/TestSettings.cs @@ -1,4 +1,6 @@ -using ClientServer.Models.Interfaces; +using System.ComponentModel.DataAnnotations; +using ClientServer.Db; +using ClientServer.Models.Interfaces; namespace ClientServer.Models.Exercises.Tests { @@ -28,5 +30,11 @@ namespace ClientServer.Models.Exercises.Tests /// the max amount of disk space the <see cref="Test"/> can write to /// </summary> public int MaxDiskSpaceInKb { get; set; } + + /// <summary> + /// some compiler options .g. -Xlint options needs to be separated by whitespaces (like normal command args) + /// </summary> + [MaxLength(SyndromDbContext.DefaultMaxStringLength)] + public string CompilerOptions { get; set; } } } diff --git a/src/ClientServer/Models/Files/FileReferenceMarkdownAsset.cs b/src/ClientServer/Models/Files/FileReferenceMarkdownAsset.cs index 734acfdad66b6965dc577782fa39ab6a5237de21..9b8bb08fe690cd4b41fb283601e8eecd1479216e 100644 --- a/src/ClientServer/Models/Files/FileReferenceMarkdownAsset.cs +++ b/src/ClientServer/Models/Files/FileReferenceMarkdownAsset.cs @@ -26,16 +26,6 @@ namespace ClientServer.Models.Files /// </summary> [MaxLength(SyndromDbContext.DefaultMaxStringLength)] public string Hash { get; set; } - - /// <summary> - /// the file path relative to the base file upload dir - /// normally <see cref="AppConfiguration.FileUploadDirRelativePath"/> combined with one of - /// <see cref="AppConfiguration.MarkdownAssetFilesUploadDirName"/> or - /// <see cref="AppConfiguration.TestAssetFilesUploadDirName"/> or - /// <see cref="AppConfiguration.UserAssetFilesUploadDirName"/> - /// </summary> - [MaxLength(SyndromDbContext.PathsMaxStringLength)] - public string RelativePath { get; set; } /// <summary> /// original name of the file (at the time the file was uploaded) diff --git a/src/ClientServer/Models/Files/FileReferenceTestAsset.cs b/src/ClientServer/Models/Files/FileReferenceTestAsset.cs index a9f960f821f00d3a4802b322ffa680896be7239b..78133c3314e4ffc38d0e66b6f7a1640599ed8072 100644 --- a/src/ClientServer/Models/Files/FileReferenceTestAsset.cs +++ b/src/ClientServer/Models/Files/FileReferenceTestAsset.cs @@ -16,22 +16,17 @@ namespace ClientServer.Models.Files { public int Id { get; set; } + public FileReferenceTestAsset() + { + AssetReferences = new List<TestWithFileAsAssetReference>(); + } + /// <summary> /// md5 hash of the file content /// </summary> [MaxLength(SyndromDbContext.DefaultMaxStringLength)] public string Hash { get; set; } - /// <summary> - /// the file path relative to the base file upload dir - /// normally <see cref="AppConfiguration.FileUploadDirRelativePath"/> combined with one of - /// <see cref="AppConfiguration.MarkdownAssetFilesUploadDirName"/> or - /// <see cref="AppConfiguration.TestAssetFilesUploadDirName"/> or - /// <see cref="AppConfiguration.UserAssetFilesUploadDirName"/> - /// </summary> - [MaxLength(SyndromDbContext.PathsMaxStringLength)] - public string RelativePath { get; set; } - /// <summary> /// original name of the file (at the time the file was uploaded) /// </summary> diff --git a/src/ClientServer/Models/Files/FileReferenceUserFileAsset.cs b/src/ClientServer/Models/Files/FileReferenceUserFileAsset.cs index c96f9288bbe3a466099f0221040563579fbe73d9..7edfb1af98afc2de5e2e2ebd78458d8df2784a79 100644 --- a/src/ClientServer/Models/Files/FileReferenceUserFileAsset.cs +++ b/src/ClientServer/Models/Files/FileReferenceUserFileAsset.cs @@ -17,22 +17,19 @@ namespace ClientServer.Models.Files { public int Id { get; set; } + public FileReferenceUserFileAsset() + { + CustomTestWithFileAsAssetReferences = new List<CustomTestWithFileAsAssetReference>(); + CustomProjectTestWithFileAsAssetReferences = new List<CustomProjectTestWithFileAsAssetReference>(); + CustomProjectDescriptionWithFileAsAssetReferences = new List<CustomProjectDescriptionWithFileAsAssetReference>(); + } + /// <summary> /// md5 hash of the file content /// </summary> [MaxLength(SyndromDbContext.DefaultMaxStringLength)] public string Hash { get; set; } - /// <summary> - /// the file path relative to the base file upload dir - /// normally <see cref="AppConfiguration.FileUploadDirRelativePath"/> combined with one of - /// <see cref="AppConfiguration.MarkdownAssetFilesUploadDirName"/> or - /// <see cref="AppConfiguration.TestAssetFilesUploadDirName"/> or - /// <see cref="AppConfiguration.UserAssetFilesUploadDirName"/> - /// </summary> - [MaxLength(SyndromDbContext.PathsMaxStringLength)] - public string RelativePath { get; set; } - /// <summary> /// original name of the file (at the time the file was uploaded) /// </summary> diff --git a/src/ClientServer/Models/Interfaces/ITestSettings.cs b/src/ClientServer/Models/Interfaces/ITestSettings.cs index 112033d9cb6d4fd2dfe033a3beefa054a3105f31..07d71b2b4a9eec449155ff44a6d26409b2bf0acd 100644 --- a/src/ClientServer/Models/Interfaces/ITestSettings.cs +++ b/src/ClientServer/Models/Interfaces/ITestSettings.cs @@ -23,5 +23,10 @@ namespace ClientServer.Models.Interfaces /// the max amount of disk space the <see cref="Test"/> can write to /// </summary> int MaxDiskSpaceInKb { get; set; } + + /// <summary> + /// some compiler options .g. -Xlint options needs to be separated by whitespaces (like normal command args) + /// </summary> + string CompilerOptions { get; set; } } }