From acea39fb6bd27eb114b03a09a2923496b6ca2fb2 Mon Sep 17 00:00:00 2001 From: Namu Date: Sat, 27 Dec 2025 17:54:07 +0100 Subject: [PATCH] Feat: Add Project and ProjectTask entities --- .../Data/ApplicationDbContext.cs | 2 + WorkManagementTool/Data/Entities/Project.cs | 10 + .../Data/Entities/ProjectTask.cs | 13 + ...64404_AddProjectAndProjectTask.Designer.cs | 522 ++++++++++++++++++ ...20251227164404_AddProjectAndProjectTask.cs | 78 +++ .../ApplicationDbContextModelSnapshot.cs | 85 ++- WorkManagementTool/Services/ProjectService.cs | 50 ++ .../Services/ProjectTaskService.cs | 55 ++ WorkManagementTool/work_management.db | Bin 139264 -> 159744 bytes WorkManagementTool/work_management.db-shm | Bin 32768 -> 0 bytes WorkManagementTool/work_management.db-wal | Bin 28872 -> 0 bytes 11 files changed, 813 insertions(+), 2 deletions(-) create mode 100644 WorkManagementTool/Data/Entities/Project.cs create mode 100644 WorkManagementTool/Data/Entities/ProjectTask.cs create mode 100644 WorkManagementTool/Migrations/20251227164404_AddProjectAndProjectTask.Designer.cs create mode 100644 WorkManagementTool/Migrations/20251227164404_AddProjectAndProjectTask.cs create mode 100644 WorkManagementTool/Services/ProjectService.cs create mode 100644 WorkManagementTool/Services/ProjectTaskService.cs delete mode 100644 WorkManagementTool/work_management.db-shm delete mode 100644 WorkManagementTool/work_management.db-wal diff --git a/WorkManagementTool/Data/ApplicationDbContext.cs b/WorkManagementTool/Data/ApplicationDbContext.cs index 05d6b89..18e41c8 100644 --- a/WorkManagementTool/Data/ApplicationDbContext.cs +++ b/WorkManagementTool/Data/ApplicationDbContext.cs @@ -8,5 +8,7 @@ namespace WorkManagementTool.Data { public DbSet Homeworks { get; set; } = null!; public DbSet SchoolSubjects { get; set; } = null!; + public DbSet Projects { get; set; } = null!; + public DbSet ProjectTasks { get; set; } = null!; } } diff --git a/WorkManagementTool/Data/Entities/Project.cs b/WorkManagementTool/Data/Entities/Project.cs new file mode 100644 index 0000000..0d66463 --- /dev/null +++ b/WorkManagementTool/Data/Entities/Project.cs @@ -0,0 +1,10 @@ +namespace WorkManagementTool.Data.Entities +{ + public class Project + { + public int Id { get; set; } + public string Name { get; set; } = null!; + public string? Description { get; set; } + public List Tasks { get; set; } = new(); + } +} diff --git a/WorkManagementTool/Data/Entities/ProjectTask.cs b/WorkManagementTool/Data/Entities/ProjectTask.cs new file mode 100644 index 0000000..f55766d --- /dev/null +++ b/WorkManagementTool/Data/Entities/ProjectTask.cs @@ -0,0 +1,13 @@ +namespace WorkManagementTool.Data.Entities +{ + public class ProjectTask + { + public int Id { get; set; } + public string Title { get; set; } = null!; + public string? Description { get; set; } + public DateTime DueDate { get; set; } + public bool IsCompleted { get; set; } + public List? NextTasks { get; set; } + public Project Project { get; set; } = null!; + } +} diff --git a/WorkManagementTool/Migrations/20251227164404_AddProjectAndProjectTask.Designer.cs b/WorkManagementTool/Migrations/20251227164404_AddProjectAndProjectTask.Designer.cs new file mode 100644 index 0000000..59f783b --- /dev/null +++ b/WorkManagementTool/Migrations/20251227164404_AddProjectAndProjectTask.Designer.cs @@ -0,0 +1,522 @@ +// +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("20251227164404_AddProjectAndProjectTask")] + partial class AddProjectAndProjectTask + { + /// + 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.Project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Projects"); + }); + + modelBuilder.Entity("WorkManagementTool.Data.Entities.ProjectTask", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("DueDate") + .HasColumnType("TEXT"); + + b.Property("IsCompleted") + .HasColumnType("INTEGER"); + + b.Property("ProjectId") + .HasColumnType("INTEGER"); + + b.Property("ProjectTaskId") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ProjectTaskId"); + + b.ToTable("ProjectTasks"); + }); + + 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() + .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("Homeworks") + .HasForeignKey("SchoolSubjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("CreatedBy"); + + b.Navigation("SchoolSubject"); + }); + + modelBuilder.Entity("WorkManagementTool.Data.Entities.ProjectTask", b => + { + b.HasOne("WorkManagementTool.Data.Entities.Project", "Project") + .WithMany("Tasks") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("WorkManagementTool.Data.Entities.ProjectTask", null) + .WithMany("NextTasks") + .HasForeignKey("ProjectTaskId"); + + b.Navigation("Project"); + }); + + modelBuilder.Entity("WorkManagementTool.Data.Entities.SchoolSubject", b => + { + b.HasOne("WorkManagementTool.Data.ApplicationUser", "CreatedBy") + .WithMany() + .HasForeignKey("CreatedById"); + + b.Navigation("CreatedBy"); + }); + + modelBuilder.Entity("WorkManagementTool.Data.Entities.Project", b => + { + b.Navigation("Tasks"); + }); + + modelBuilder.Entity("WorkManagementTool.Data.Entities.ProjectTask", b => + { + b.Navigation("NextTasks"); + }); + + modelBuilder.Entity("WorkManagementTool.Data.Entities.SchoolSubject", b => + { + b.Navigation("Homeworks"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/WorkManagementTool/Migrations/20251227164404_AddProjectAndProjectTask.cs b/WorkManagementTool/Migrations/20251227164404_AddProjectAndProjectTask.cs new file mode 100644 index 0000000..51245e8 --- /dev/null +++ b/WorkManagementTool/Migrations/20251227164404_AddProjectAndProjectTask.cs @@ -0,0 +1,78 @@ +using System; +using Microsoft.EntityFrameworkCore.Migrations; + +#nullable disable + +namespace WorkManagementTool.Migrations +{ + /// + public partial class AddProjectAndProjectTask : Migration + { + /// + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Projects", + columns: table => new + { + Id = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + Name = table.Column(type: "TEXT", nullable: false), + Description = table.Column(type: "TEXT", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Projects", x => x.Id); + }); + + migrationBuilder.CreateTable( + name: "ProjectTasks", + columns: table => new + { + Id = table.Column(type: "INTEGER", nullable: false) + .Annotation("Sqlite:Autoincrement", true), + Title = table.Column(type: "TEXT", nullable: false), + Description = table.Column(type: "TEXT", nullable: true), + DueDate = table.Column(type: "TEXT", nullable: false), + IsCompleted = table.Column(type: "INTEGER", nullable: false), + ProjectId = table.Column(type: "INTEGER", nullable: false), + ProjectTaskId = table.Column(type: "INTEGER", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_ProjectTasks", x => x.Id); + table.ForeignKey( + name: "FK_ProjectTasks_ProjectTasks_ProjectTaskId", + column: x => x.ProjectTaskId, + principalTable: "ProjectTasks", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_ProjectTasks_Projects_ProjectId", + column: x => x.ProjectId, + principalTable: "Projects", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_ProjectTasks_ProjectId", + table: "ProjectTasks", + column: "ProjectId"); + + migrationBuilder.CreateIndex( + name: "IX_ProjectTasks_ProjectTaskId", + table: "ProjectTasks", + column: "ProjectTaskId"); + } + + /// + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "ProjectTasks"); + + migrationBuilder.DropTable( + name: "Projects"); + } + } +} diff --git a/WorkManagementTool/Migrations/ApplicationDbContextModelSnapshot.cs b/WorkManagementTool/Migrations/ApplicationDbContextModelSnapshot.cs index 40945cb..4d4db29 100644 --- a/WorkManagementTool/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/WorkManagementTool/Migrations/ApplicationDbContextModelSnapshot.cs @@ -276,6 +276,58 @@ namespace WorkManagementTool.Migrations b.ToTable("Homeworks"); }); + modelBuilder.Entity("WorkManagementTool.Data.Entities.Project", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("Name") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.ToTable("Projects"); + }); + + modelBuilder.Entity("WorkManagementTool.Data.Entities.ProjectTask", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasColumnType("INTEGER"); + + b.Property("Description") + .HasColumnType("TEXT"); + + b.Property("DueDate") + .HasColumnType("TEXT"); + + b.Property("IsCompleted") + .HasColumnType("INTEGER"); + + b.Property("ProjectId") + .HasColumnType("INTEGER"); + + b.Property("ProjectTaskId") + .HasColumnType("INTEGER"); + + b.Property("Title") + .IsRequired() + .HasColumnType("TEXT"); + + b.HasKey("Id"); + + b.HasIndex("ProjectId"); + + b.HasIndex("ProjectTaskId"); + + b.ToTable("ProjectTasks"); + }); + modelBuilder.Entity("WorkManagementTool.Data.Entities.SchoolSubject", b => { b.Property("Id") @@ -297,7 +349,6 @@ namespace WorkManagementTool.Migrations b.Property("Name") .IsRequired() - .HasMaxLength(100) .HasColumnType("TEXT"); b.HasKey("Id"); @@ -414,7 +465,7 @@ namespace WorkManagementTool.Migrations .HasForeignKey("CreatedById"); b.HasOne("WorkManagementTool.Data.Entities.SchoolSubject", "SchoolSubject") - .WithMany() + .WithMany("Homeworks") .HasForeignKey("SchoolSubjectId") .OnDelete(DeleteBehavior.Cascade) .IsRequired(); @@ -424,6 +475,21 @@ namespace WorkManagementTool.Migrations b.Navigation("SchoolSubject"); }); + modelBuilder.Entity("WorkManagementTool.Data.Entities.ProjectTask", b => + { + b.HasOne("WorkManagementTool.Data.Entities.Project", "Project") + .WithMany("Tasks") + .HasForeignKey("ProjectId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("WorkManagementTool.Data.Entities.ProjectTask", null) + .WithMany("NextTasks") + .HasForeignKey("ProjectTaskId"); + + b.Navigation("Project"); + }); + modelBuilder.Entity("WorkManagementTool.Data.Entities.SchoolSubject", b => { b.HasOne("WorkManagementTool.Data.ApplicationUser", "CreatedBy") @@ -432,6 +498,21 @@ namespace WorkManagementTool.Migrations b.Navigation("CreatedBy"); }); + + modelBuilder.Entity("WorkManagementTool.Data.Entities.Project", b => + { + b.Navigation("Tasks"); + }); + + modelBuilder.Entity("WorkManagementTool.Data.Entities.ProjectTask", b => + { + b.Navigation("NextTasks"); + }); + + modelBuilder.Entity("WorkManagementTool.Data.Entities.SchoolSubject", b => + { + b.Navigation("Homeworks"); + }); #pragma warning restore 612, 618 } } diff --git a/WorkManagementTool/Services/ProjectService.cs b/WorkManagementTool/Services/ProjectService.cs new file mode 100644 index 0000000..2c9da0d --- /dev/null +++ b/WorkManagementTool/Services/ProjectService.cs @@ -0,0 +1,50 @@ +using Microsoft.EntityFrameworkCore; +using WorkManagementTool.Data; +using WorkManagementTool.Data.Entities; + +namespace WorkManagementTool.Services +{ + public class ProjectService + { + private readonly ApplicationDbContext _context; + + public ProjectService(ApplicationDbContext context) + { + _context = context; + } + + public async Task> GetAllProjectsAsync() + { + return await _context.Projects.ToListAsync(); + } + + public async Task GetProjectByIdAsync(int projectId) + { + return await _context.Projects + .Include(p => p.Tasks) + .FirstOrDefaultAsync(p => p.Id == projectId); + } + + public async Task AddProjectAsync(Project project) + { + _context.Projects.Add(project); + await _context.SaveChangesAsync(); + } + + public async Task UpdateProjectAsync(Project project) + { + _context.Projects.Update(project); + await _context.SaveChangesAsync(); + } + + public async Task DeleteProjectAsync(int projectId) + { + var project = await _context.Projects.FindAsync(projectId); + if (project != null) + { + _context.Projects.Remove(project); + await _context.SaveChangesAsync(); + } + } + } +} diff --git a/WorkManagementTool/Services/ProjectTaskService.cs b/WorkManagementTool/Services/ProjectTaskService.cs new file mode 100644 index 0000000..aa25233 --- /dev/null +++ b/WorkManagementTool/Services/ProjectTaskService.cs @@ -0,0 +1,55 @@ +using Microsoft.EntityFrameworkCore; +using WorkManagementTool.Data; +using WorkManagementTool.Data.Entities; + +namespace WorkManagementTool.Services +{ + public class ProjectTaskService + { + private readonly ApplicationDbContext _context; + + public ProjectTaskService(ApplicationDbContext context) + { + _context = context; + } + + public async Task> GetAllTasksAsync(int projectId) + { + return await _context.ProjectTasks + .Include(t => t.NextTasks) + .Include(t => t.Project) + .Where(w => w.Project.Id == projectId) + .ToListAsync(); + } + + public async Task GetTaskByIdAsync(int taskId) + { + return await _context.ProjectTasks + .Include(t => t.NextTasks) + .Include(t => t.Project) + .FirstOrDefaultAsync(t => t.Id == taskId); + } + + public async Task AddTaskAsync(ProjectTask task) + { + _context.ProjectTasks.Add(task); + await _context.SaveChangesAsync(); + } + + public async Task UpdateTaskAsync(ProjectTask task) + { + _context.ProjectTasks.Update(task); + await _context.SaveChangesAsync(); + } + + public async Task DeleteTaskAsync(int taskId) + { + var task = await _context.ProjectTasks.FindAsync(taskId); + if (task != null) + { + _context.ProjectTasks.Remove(task); + await _context.SaveChangesAsync(); + } + } + } +} diff --git a/WorkManagementTool/work_management.db b/WorkManagementTool/work_management.db index eb4ffef9b48aca583259b1788cce6d4d82cc15e3..5e349f13afbda34f02df9850d226ca66d979465a 100644 GIT binary patch delta 2050 zcmeHH!B5*(825{v*@h%9k=g-8P&dFJ>l|#yaRO2S8%zi!210@oDwUZyK^<#QnlMJy z3DQm5PFs<+=2En&J?zj!JCK&$)_-A|rcS-AQnl?kP1QJTm)UDlk||7_w#%O7r|)~; z_rC9azxVsz&O>7733;>Ag&_#iZ~V2V_2ZlMp%Lj*eh7-;+%rL{)4KEaG2z&x>LG8fhT!b8hq8B?j zhV!!=7hnaRXZU4N)8?+OzmZ87#avB_tA#a|@fx3gYcSV>!c7GJ4DZ5CBg|#Uo<}c& z6GlPDu@VXN+k+zqKaF-%gvH@Rpv~bl0%4Br(w4=Q=rIOa@<$U0K_Dc-WtptNF&TO& z!=`Co;8|J?uqw@PD@>M2t3uG9R@5sSV=U+MX0Iw@H1U@>8Ed{O&Wpwfi(*P$H6>XI zBqjE(TvFq=H}ZKYn9Qq^z{chS{O0rmUsPwKH>r?$9A;mTGf9+E@ShPJxl zlc&}M@xp}#VKJ4A%=p7xQdXj=X^xjCQa)iyT3U)k<3b{+4GEe*$kPEfo1u9>r_rh) z4AE&`V>G`O2xM27QeJng9}*ULAA$Gb_XZ+&Aw7U5z)29W^rHz_JLB@<(!szJDgmulEtJ*p{9iEiBsqs zkI7dKp$de?fnx0*06 zN)fp+qJ9&4TaJ9oA4%X2Ue)z^{FENG5icLv*Nn8rx#Mz3j_JSRo#{H$i)tH6Hx+Z! zmQ@= zwyrL4W1$|sLN!yNrzvU$6R{dX<&P!MTfP^qnHiZU3kqD{%*-gp#KLdF{9v*y zv-RWyEUw$<8Z)Nzs0lJDFz_tr$>2K9)y8p|NrA(k{ULiS+f6oK)^n^mEWh}>_}Tet zfVO^P+&*x@n=N7~T3@)`gD DDKTO= diff --git a/WorkManagementTool/work_management.db-shm b/WorkManagementTool/work_management.db-shm deleted file mode 100644 index 8f88064ecf98d42fce00ecf8c2f6b971b31447a1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 32768 zcmeI)KMsL07zg0`FJUlR5O#w*IDpCG0*tQV2nHvRNW|_628rD@477q6Ni4oRzvNBZ z?|aj<&jH#z_d`lPRxX4_C62vVr`c{ZnhdtXV|}q+O_#0OzB|4g=FKnr<5u^ieXnnM ze0~k-e>GM+Rwq_kKj(2O1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk z1PBlyK!5-N0t5&UAV7cs0RjXF5FkK+009C72oNAZfB*pk1PBlyK!5-N0t5&UAV7cs z0RjXF{DnX+l>XwJ4oTqm0_mM!$(BGNl(Tgqw;}McK=J-o_{Z%U2@oJafB*pk1PBly gK!5-N0t5&UAV7cs0RjXF5FkK+009C72xLg$2I|u$_y7O^ diff --git a/WorkManagementTool/work_management.db-wal b/WorkManagementTool/work_management.db-wal deleted file mode 100644 index ebebe2175106e9a039c59682b28f96c5f7036d54..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 28872 zcmeI)&ui0Q7zgmI1MTK!=Sfjq^ld0QUy9y%n zIQ$EC@a#bx%D|I%@gykf*S!_V;n29{&de0uX=z z1Rwwb2tWV=5P$##c8$PHD{!EE(jUPY*(h_tAlDTXJ>Fv??-I=wY$7p9Af_UigcmK| z<870vvYj=@8$*If2fWE_*eL(ljTbhKhVx;6B*WpVInv(Kvq~i*+`3+Iq{hTVM6FDi z5hfJ!iquRMrMj6GQl^n+=jyfma7)ZgjknxVLQg~*&Papm!`E1NaInZORx6pboD?g1 z)~KdLNsm=28;;a!8KcC?wxwCTBr1fOnoJ~3aEN9}5)ml19sd}WZEI$t<3PFJA6>t5 zr>;d^Q{##3sXUQn%O;k?^F(E$EK*t3s4LcQjGIH#e&(eMMtG<)5HGBctjjs<6q~K6 zc!Q=#lk{v!ZBE8Bg`3%wTujGhPj3~9ZpO2w$5~|96~}T#O~~EWwNd?gGkQUeUL4C0 z4$@>g>0eUM(U_i(#uBw$reqlL6pO^FrF_0(TAt`go<&s6R){1>4pA-U5IEqc)C=~0Iler%@A3I=KNbkhbD{ar`}T1R2tWV=5P$##AOHafKmY;|fB*!x zUEp+QxnnbBn!u^fa@S^R8h%E{+F7mC1riGn4^JH=vp?$si(F_iw6yJ6;|3rA0SG_< z0uX=z1Rwwb2tWV=5cpStQ0K{xRdYB3J)Qkszh*Z0C++vQ6DxIr?w8-5M_;KmY;|fB*y_009U<00Izzz>X65TU}sHe}RwpU%N-?)GPEC*ip|AHv<6(KmY;| zfB*y_009Upil7`2t(^$>Bl}fB*y_009U<00Izz00bZaf&VG+ yxA_8V))CAvTz&UcxST^>;D0_6oEriVfB*y_009U<00Izz00bbgWdeV!3w#HxJ(iFF