From f333cac61a84e5fdd8b14e4a35782902794e0ee7 Mon Sep 17 00:00:00 2001 From: Namu Date: Sun, 30 Nov 2025 19:02:29 +0100 Subject: [PATCH] Feat: Add school subjet and homework management management (still WIP) --- .../Homework/HomeworkCreation.razor | 77 +++ .../Components/Homework/HomeworkDisplay.razor | 39 ++ .../Components/Homework/HomeworkListing.razor | 63 +++ .../Components/Layout/NavMenu.razor | 2 +- .../SchoolSubject/SchoolSubjectCreation.razor | 20 +- .../SchoolSubject/SchoolSubjectListing.razor | 11 +- WorkManagementTool/Data/Entities/Homework.cs | 19 +- .../Data/Entities/SchoolSubject.cs | 9 +- ...AndMissingCreatedAtForHomework.Designer.cs | 441 ++++++++++++++++++ ...redFieldsAndMissingCreatedAtForHomework.cs | 41 ++ .../ApplicationDbContextModelSnapshot.cs | 10 + .../Services/HomeworkService.cs | 24 + WorkManagementTool/work_management.db | Bin 139264 -> 139264 bytes WorkManagementTool/work_management.db-shm | Bin 32768 -> 32768 bytes WorkManagementTool/work_management.db-wal | Bin 78312 -> 16512 bytes 15 files changed, 741 insertions(+), 15 deletions(-) create mode 100644 WorkManagementTool/Components/Homework/HomeworkCreation.razor create mode 100644 WorkManagementTool/Components/Homework/HomeworkDisplay.razor create mode 100644 WorkManagementTool/Components/Homework/HomeworkListing.razor create mode 100644 WorkManagementTool/Migrations/20251130000007_AddRequiredFieldsAndMissingCreatedAtForHomework.Designer.cs create mode 100644 WorkManagementTool/Migrations/20251130000007_AddRequiredFieldsAndMissingCreatedAtForHomework.cs diff --git a/WorkManagementTool/Components/Homework/HomeworkCreation.razor b/WorkManagementTool/Components/Homework/HomeworkCreation.razor new file mode 100644 index 0000000..6828237 --- /dev/null +++ b/WorkManagementTool/Components/Homework/HomeworkCreation.razor @@ -0,0 +1,77 @@ +@page "/homeworks/creation/{IdSchoolSubject:int}" + +@using System.Threading.Tasks +@using WorkManagementTool.Services +@using WorkManagementTool.Data.Entities + +@inject HomeworkService HomeworkService +@inject NavigationManager NavigationManager +@inject SchoolSubjectService SchoolSubjectService + +

HomeworkCreation

+ +@if (SchoolSubject is null) +{ +

School subject not found

+} +else +{ + + + + +
+ + +
+
+ + +
+
+ + +
+
+ + +
+
+ + +
+ +
+} + +@code { + [SupplyParameterFromForm] + private Homework? Model { get; set; } + + [Parameter] + public int IdSchoolSubject { get; set; } + + private SchoolSubject? SchoolSubject { get; set; } + + protected override async Task OnInitializedAsync() + { + Model ??= new Homework + { + Title = null!, + Deleted = false, + DueDate = DateTime.Now.AddDays(1), + IsCompleted = false, + }; + SchoolSubject = await SchoolSubjectService.GetSchoolSubjectByIdAsync(IdSchoolSubject); + } + + private async Task Submit() + { + if (Model is not null && SchoolSubject is not null) + { + Model!.SchoolSubject = SchoolSubject!; + await HomeworkService.AddHomeworkAsync(Model!); + NavigationManager.NavigateTo($"/homeworks/{IdSchoolSubject}"); + } + } +} diff --git a/WorkManagementTool/Components/Homework/HomeworkDisplay.razor b/WorkManagementTool/Components/Homework/HomeworkDisplay.razor new file mode 100644 index 0000000..34b2d47 --- /dev/null +++ b/WorkManagementTool/Components/Homework/HomeworkDisplay.razor @@ -0,0 +1,39 @@ +

HomeworkDisplay

+ +@using WorkManagementTool.Services +@using WorkManagementTool.Data.Entities; + +@inject HomeworkService HomeworkService + +@if (homework is null) +{ +

Homework not found

+} +else +{ +
+ Title +
@homework.Title
+ + Description +
@homework.Description
+ + Due date +
@homework.DueDate
+ + Completed +
@homework.IsCompleted
+
+} + +@code { + [Parameter] + public int Id { get; set; } + + private Homework? homework; + + protected override async Task OnInitializedAsync() + { + homework = await HomeworkService.GetHomeworkByIdAsync(Id); + } +} diff --git a/WorkManagementTool/Components/Homework/HomeworkListing.razor b/WorkManagementTool/Components/Homework/HomeworkListing.razor new file mode 100644 index 0000000..f621849 --- /dev/null +++ b/WorkManagementTool/Components/Homework/HomeworkListing.razor @@ -0,0 +1,63 @@ +@page "/homeworks/{IdSchoolSubject:int}" +@rendermode InteractiveServer +@using WorkManagementTool.Services +@using WorkManagementTool.Data.Entities +@inject HomeworkService HomeworkService + +

HomeworkListing

+ ++ + +
+ + +
+ +@if (homeworkList == null) +{ +

Loading...

+} +else if (homeworkList.Count == 0) +{ +

No homework found

+} +else +{ + +} + +@code { + private List? homeworkList; + [Parameter] + public int IdSchoolSubject { get; set; } + private bool showCompleted { get; set; } = false; + + protected override async Task OnInitializedAsync() + { + await LoadHomeworksAsync(); + } + + private async Task LoadHomeworksAsync() + { + homeworkList = new(); + var uncompletedHomework = await HomeworkService.GetUncompletedHomeworkAsync(IdSchoolSubject); + homeworkList.AddRange(uncompletedHomework); + + if (showCompleted) + { + var completedHomework = await HomeworkService.GetCompletedHomeworksAsync(IdSchoolSubject); + homeworkList.AddRange(completedHomework); + } + } +} diff --git a/WorkManagementTool/Components/Layout/NavMenu.razor b/WorkManagementTool/Components/Layout/NavMenu.razor index 20bfa40..2792578 100644 --- a/WorkManagementTool/Components/Layout/NavMenu.razor +++ b/WorkManagementTool/Components/Layout/NavMenu.razor @@ -26,7 +26,7 @@ diff --git a/WorkManagementTool/Components/SchoolSubject/SchoolSubjectCreation.razor b/WorkManagementTool/Components/SchoolSubject/SchoolSubjectCreation.razor index e5d5c68..6727725 100644 --- a/WorkManagementTool/Components/SchoolSubject/SchoolSubjectCreation.razor +++ b/WorkManagementTool/Components/SchoolSubject/SchoolSubjectCreation.razor @@ -7,8 +7,10 @@

SchoolSubjectCreation

-
- + + + +
@@ -18,13 +20,23 @@
- +
@code { [SupplyParameterFromForm] private SchoolSubject? Model { get; set; } - protected override void OnInitialized() => Model ??= new(); + protected override void OnInitialized() + { + if (Model is null) + { + Model = new SchoolSubject + { + Name = null!, + Description = null, + }; + } + } private async Task Submit() { diff --git a/WorkManagementTool/Components/SchoolSubject/SchoolSubjectListing.razor b/WorkManagementTool/Components/SchoolSubject/SchoolSubjectListing.razor index 84d62df..4e065ab 100644 --- a/WorkManagementTool/Components/SchoolSubject/SchoolSubjectListing.razor +++ b/WorkManagementTool/Components/SchoolSubject/SchoolSubjectListing.razor @@ -23,10 +23,13 @@ else
    @foreach (var schoolSubject in schoolSubjects) { - -
    - -
    +
  • + +
    + + Manage homeworks +
    +
  • }
} diff --git a/WorkManagementTool/Data/Entities/Homework.cs b/WorkManagementTool/Data/Entities/Homework.cs index 6e881ae..2fecf41 100644 --- a/WorkManagementTool/Data/Entities/Homework.cs +++ b/WorkManagementTool/Data/Entities/Homework.cs @@ -1,14 +1,25 @@ -namespace WorkManagementTool.Data.Entities +using System.ComponentModel.DataAnnotations; + +namespace WorkManagementTool.Data.Entities { public class Homework { public int Id { get; set; } - public string Title { get; set; } = null!; + [Required] + [MaxLength(200, ErrorMessage = "Title must be less than 200 caracters")] + [MinLength(3, ErrorMessage = "Title must be at least 3 caracters")] + public required string Title { get; set; } = null!; + [MaxLength(1000, ErrorMessage = "Description must be less than 1000 caracters")] + [MinLength(3, ErrorMessage = "Description must be at least 3 caracters")] public string? Description { get; set; } - public DateTime DueDate { get; set; } - public bool IsCompleted { get; set; } + [Required] + [DataType(DataType.Date)] + public required DateTime DueDate { get; set; } + public required bool IsCompleted { get; set; } public SchoolSubject SchoolSubject { get; set; } = null!; public string? DeliveryMethod { get; set; } public ApplicationUser CreatedBy { get; set; } = null!; + public bool Deleted { get; set; } = false; + public DateTime CreatedAt { get; set; } = DateTime.UtcNow; } } diff --git a/WorkManagementTool/Data/Entities/SchoolSubject.cs b/WorkManagementTool/Data/Entities/SchoolSubject.cs index 14d298d..61766ed 100644 --- a/WorkManagementTool/Data/Entities/SchoolSubject.cs +++ b/WorkManagementTool/Data/Entities/SchoolSubject.cs @@ -1,9 +1,14 @@ -namespace WorkManagementTool.Data.Entities +using System.ComponentModel.DataAnnotations; + +namespace WorkManagementTool.Data.Entities { public class SchoolSubject { public int Id { get; set; } - public string Name { get; set; } = null!; + [Required] + [MaxLength(100, ErrorMessage = "Name must be less than 100 caracters")] + public required string Name { get; set; } = null!; + [MaxLength(500, ErrorMessage = "Description must be less than 500 caracters")] public string? Description { get; set; } public DateTime CreatedAt { get; set; } = DateTime.UtcNow; public bool Deleted { get; set; } = false; diff --git a/WorkManagementTool/Migrations/20251130000007_AddRequiredFieldsAndMissingCreatedAtForHomework.Designer.cs b/WorkManagementTool/Migrations/20251130000007_AddRequiredFieldsAndMissingCreatedAtForHomework.Designer.cs new file mode 100644 index 0000000..230b178 --- /dev/null +++ b/WorkManagementTool/Migrations/20251130000007_AddRequiredFieldsAndMissingCreatedAtForHomework.Designer.cs @@ -0,0 +1,441 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using WorkManagementTool.Data; + +#nullable disable + +namespace WorkManagementTool.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20251130000007_AddRequiredFieldsAndMissingCreatedAtForHomework")] + partial class AddRequiredFieldsAndMissingCreatedAtForHomework + { + /// + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder.HasAnnotation("ProductVersion", "10.0.0"); + + 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.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") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("ProviderKey") + .HasMaxLength(128) + .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.IdentityUserPasskey", b => + { + b.Property("CredentialId") + .HasMaxLength(1024) + .HasColumnType("BLOB"); + + b.Property("UserId") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("CredentialId"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserPasskeys", (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") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Name") + .HasMaxLength(128) + .HasColumnType("TEXT"); + + b.Property("Value") + .HasColumnType("TEXT"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("WorkManagementTool.Data.ApplicationUser", b => + { + b.Property("Id") + .HasColumnType("TEXT"); + + b.Property("AccessFailedCount") + .HasColumnType("INTEGER"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken() + .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") + .HasMaxLength(256) + .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("AspNetUsers", (string)null); + }); + + modelBuilder.Entity("WorkManagementTool.Data.Entities.Homework", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CreatedAt") + .HasColumnType("TEXT"); + + b.Property("CreatedById") + .HasColumnType("TEXT"); + + b.Property("Deleted") + .HasColumnType("INTEGER"); + + b.Property("DeliveryMethod") + .HasColumnType("TEXT"); + + b.Property("Description") + .HasMaxLength(1000) + .HasColumnType("TEXT"); + + b.Property("DueDate") + .HasColumnType("TEXT"); + + b.Property("IsCompleted") + .HasColumnType("INTEGER"); + + b.Property("SchoolSubjectId") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasMaxLength(200) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.HasIndex("SchoolSubjectId"); + + b.ToTable("Homeworks"); + }); + + modelBuilder.Entity("WorkManagementTool.Data.Entities.SchoolSubject", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("CreatedAt") + .HasColumnType("TEXT"); + + b.Property("CreatedById") + .HasColumnType("TEXT"); + + b.Property("Deleted") + .HasColumnType("INTEGER"); + + b.Property("Description") + .HasMaxLength(500) + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasMaxLength(100) + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("CreatedById"); + + b.ToTable("SchoolSubjects"); + }); + + 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("WorkManagementTool.Data.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("WorkManagementTool.Data.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserPasskey", b => + { + b.HasOne("WorkManagementTool.Data.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.OwnsOne("Microsoft.AspNetCore.Identity.IdentityPasskeyData", "Data", b1 => + { + b1.Property("IdentityUserPasskeyCredentialId"); + + b1.Property("AttestationObject") + .IsRequired(); + + b1.Property("ClientDataJson") + .IsRequired(); + + b1.Property("CreatedAt"); + + b1.Property("IsBackedUp"); + + b1.Property("IsBackupEligible"); + + b1.Property("IsUserVerified"); + + b1.Property("Name"); + + b1.Property("PublicKey") + .IsRequired(); + + b1.Property("SignCount"); + + b1.PrimitiveCollection("Transports"); + + b1.HasKey("IdentityUserPasskeyCredentialId"); + + b1.ToTable("AspNetUserPasskeys"); + + b1.ToJson("Data"); + + b1.WithOwner() + .HasForeignKey("IdentityUserPasskeyCredentialId"); + }); + + b.Navigation("Data") + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("WorkManagementTool.Data.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("WorkManagementTool.Data.ApplicationUser", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("WorkManagementTool.Data.Entities.Homework", b => + { + b.HasOne("WorkManagementTool.Data.ApplicationUser", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById"); + + b.HasOne("WorkManagementTool.Data.Entities.SchoolSubject", "SchoolSubject") + .WithMany() + .HasForeignKey("SchoolSubjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("SchoolSubject"); + }); + + modelBuilder.Entity("WorkManagementTool.Data.Entities.SchoolSubject", b => + { + b.HasOne("WorkManagementTool.Data.ApplicationUser", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById"); + + b.Navigation("CreatedBy"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/WorkManagementTool/Migrations/20251130000007_AddRequiredFieldsAndMissingCreatedAtForHomework.cs b/WorkManagementTool/Migrations/20251130000007_AddRequiredFieldsAndMissingCreatedAtForHomework.cs new file mode 100644 index 0000000..f2acfc1 --- /dev/null +++ b/WorkManagementTool/Migrations/20251130000007_AddRequiredFieldsAndMissingCreatedAtForHomework.cs @@ -0,0 +1,41 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace WorkManagementTool.Migrations +{ + /// + public partial class AddRequiredFieldsAndMissingCreatedAtForHomework : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.AddColumn( + name: "CreatedAt", + table: "Homeworks", + type: "TEXT", + nullable: false, + defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified)); + + migrationBuilder.AddColumn( + name: "Deleted", + table: "Homeworks", + type: "INTEGER", + nullable: false, + defaultValue: false); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropColumn( + name: "CreatedAt", + table: "Homeworks"); + + migrationBuilder.DropColumn( + name: "Deleted", + table: "Homeworks"); + } + } +} diff --git a/WorkManagementTool/Migrations/ApplicationDbContextModelSnapshot.cs b/WorkManagementTool/Migrations/ApplicationDbContextModelSnapshot.cs index a70f29f..40945cb 100644 --- a/WorkManagementTool/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/WorkManagementTool/Migrations/ApplicationDbContextModelSnapshot.cs @@ -237,13 +237,20 @@ namespace WorkManagementTool.Migrations .ValueGeneratedOnAdd() .HasColumnType("INTEGER"); + b.Property("CreatedAt") + .HasColumnType("TEXT"); + b.Property("CreatedById") .HasColumnType("TEXT"); + b.Property("Deleted") + .HasColumnType("INTEGER"); + b.Property("DeliveryMethod") .HasColumnType("TEXT"); b.Property("Description") + .HasMaxLength(1000) .HasColumnType("TEXT"); b.Property("DueDate") @@ -257,6 +264,7 @@ namespace WorkManagementTool.Migrations b.Property("Title") .IsRequired() + .HasMaxLength(200) .HasColumnType("TEXT"); b.HasKey("Id"); @@ -284,10 +292,12 @@ namespace WorkManagementTool.Migrations .HasColumnType("INTEGER"); b.Property("Description") + .HasMaxLength(500) .HasColumnType("TEXT"); b.Property("Name") .IsRequired() + .HasMaxLength(100) .HasColumnType("TEXT"); b.HasKey("Id"); diff --git a/WorkManagementTool/Services/HomeworkService.cs b/WorkManagementTool/Services/HomeworkService.cs index 9940931..0219ebe 100644 --- a/WorkManagementTool/Services/HomeworkService.cs +++ b/WorkManagementTool/Services/HomeworkService.cs @@ -20,6 +20,30 @@ namespace WorkManagementTool.Services .ToListAsync(); } + public async Task> GetAllHomeworksAsync() + { + return await _context.Homeworks.ToListAsync(); + } + + public async Task> GetCompletedHomeworksAsync(int idSchoolSubject) + { + return await _context.Homeworks + .Where(w => w.IsCompleted && w.SchoolSubject.Id == idSchoolSubject) + .ToListAsync(); + } + + public async Task> GetUncompletedHomeworkAsync(int idSchoolSubject) + { + return await _context.Homeworks + .Where(w => !w.IsCompleted && w.SchoolSubject.Id == idSchoolSubject) + .ToListAsync(); + } + + public async Task GetHomeworkByIdAsync(int id) + { + return await _context.Homeworks.FindAsync(id); + } + public async Task AddHomeworkAsync(Homework homework) { _context.Homeworks.Add(homework); diff --git a/WorkManagementTool/work_management.db b/WorkManagementTool/work_management.db index 638b9147e5ce2d393978358aa9ce93bf8f5736fb..21bab1096d039fe7184579a4a020cbad20502a77 100644 GIT binary patch delta 1530 zcmbtUU1%It7`=CAckj;H*)MBb+aNL5xDcYvc;|0tW?zzJlO@&sEZGzzD0RC#$*!61 z>duBzsH6&to0y%sxrEq3nNq<|3W<9DZZe{w{_!j-pH0dKUE>}ya{SU^)MQ;k7I8PphM zEW^8M$!XKDY)yYD2uPeD1Q!t8g$wOu*D|~^77D*FcKZVrMPorTk7p~DY3JR=TGOfI zYmQs-vh~VD>yY`CQW}wVX<}m2Wi18Yi7ojpl;FWPY8$`*JE4f=dYQ!6i<<0wX!j zjh~D=)V?>=Q{cRt2!4i5UhHj1Ng<&Zcho)cX)FxjV!7IAxW&a2Z#(6dN2E3`JQ})K z7`|G-U6(P#T?4%KWQd}Dm-kiU*W(|>z6sIT6#0R?8C{P~L~cdg@Sm^@ByonDe}Lm3 zzIK2d>g~nL@2!oF;CVbu`*w=&qcfwkGjwu_-^a$s>Bwk4du)7$_VWo;27~_33NY4x zg!YX%uG2bSdg?%YCzY)vU&Z@Zz8b}UteqIf>%!U>dAu4~J2Qzt#&HZA2sYqznB!(< z;l)&#prn+Gp@oIcBC7^fm5iqHF6*YLn3}~aY^|I-jt?)TqW_g|XP6Z__ z-NRY)O(#VjA7N8f&FJZjX3OccWvYhdZy-@xMQ{UV6ZaFJCA`F8X-m4nL%Uo1xvmeS zr5;g4lBC73gtkqqd}?;)g}e|GQTO)e8OLi;rIVy~wl8C3fQaZIFPwAuNu88!9-U=$ zMK;r>uIV~?Ju0HXY)-__qiLs9t}fA5)uD5>ddc;2r8+&`SfqUSmaDtsbm-rVs-4ko zS!cFoS!q&OY&z6isJZSyNewxwEzLdL=(8W`j@mJXqUTRQElZJP*O?Gk@X znlV}9^Q!yreebCh$n>Y*nQ+@tqK@HgtLxoT!~Rklo~D!R5K zn8qUN_m}q|I(o9iOL?c+@DK1Fvn*rSvTdlEVe4d~RCD8PJp8ElVxenK|FjT(Mua;E z{(|4(SJ;C4@FRQ&>u`skqc0&J77!MFi1|Q#i24xmA?$ynmCx^d>{ed=* KC;W%N4*47G`EL{e delta 452 zcmZoTz|nAkV}i6G69WT-5)i|H_(UCJMy8DkEBP63Zx(d8$gi)=$jsntWME{fYiOuz zWUOFhU}a)vWoW2pVPIxvZm4ZwU}a#y3)IiZ|A2x20Z`L5{>cyYRoEE$pEK}32lDUo zZ+>ns8vqn|!@&OrDDa41REUvTlQB3sBR@YUxHKs%HMyjinRhc|z<>Ki0S=o27zLIy z8ZZiI^29R;G9)o@b#Zxftm4RI+s0zeyq(#T=_r#U<5os9hARw7{9XL)d^Hm%T5SL2 z!g!OJtEEDOU0hzCvD1FLmJ?$-AkA8NF=a%UA{V7)xfmW{or{a|aRp zGepFr`vbgq@iZ7Hh%gvCOz`EffkRNn4wK>Yq;$?IUPPGqduYGVAJ6Njx%8psd)fP_ z_-+WHqlmS!qEUGAa{I&H33BDZ&dNhtk`C6Nj;sx8?&w*W7E^c~;g2++fdB}A00@8p z2!H?xfB*=900@8p2>g2ja*99AO@wp)eAsSA(lL%NaMfBp41;Rt=B!_fBY_@jkR7ad zUr@OFcJKM-sb}n7K$1HMFXQX^jr^m0lpm6}el_AuPDIDMQ(pC>SkZc& zbn<=Lf*_&+xx&_EoqAomE1SeMHMLwSn}%r$H?krsj#or(1Wo&1t**p%UzusNydbK0 zEoC9>DDA$wa^c4bb;mUw)g+E>+a+PD)Ap69*$9F{<~O^bgLFeR99y?7O_)fFs8FQ4 z7(`Qnx4<^h-9!JLep;Cj)hO9zLn{eYwrGnNkyE2bA4U^it(hF>@_2PznQz2(rBba{ z>R#)XpVVt%5Vj*FoJl@KUhD^r*pK$R_AO?+nyp$EvC5VuOiou6I#t|C{k8SVuBoeb zndq8n?5|hiM0AdQwF78!&Z7sp-459=|GvEv*K$i>YTyKe1Z4-GYfrJPv?B{u9_Dp33*$V)Q*M#0tg_000IagfB*sr zAb}Xx{kmt(`$7E=?)k? zLqGrl1Q0*~0R#|0009ILK%i*?LmpKj;4fDQ+^Y_V>gs^7t+r4k9=GD*;Z~?4nENys z9(eDCA9WppTQ0BF5iBEpA%Fk^2q1s}0tg_000IagfIzzo{GAt2BYCK@?qE$`;H@8G zh2tMx&-&HP2@RbWP-y}30_}d`=|2JpAbgI%o&I_ot0C|Dt{(AU!1Q0*~0R#|0009ILKmY**8X{263#d=p z>{d_p^8yR2XLp27Kek!lr%?0=@&ej{h5!NxAbxHCx3X8 z8dlA^gF}y&Uhg?oys|bga7oBZtUK5Nm!2UYfB*srAbi0^T3Da zKe3IfQz&gUS200IagfB*srAbcsb=ML2X3xB~`_A!Sb%?+vS9Bf0id=3_b$X2e0tg_000IagfB*srAb