Commit 3523f34a authored by hasan khaddour's avatar hasan khaddour

Update Persistence an bakjobs

parent 624fadfb
...@@ -5,6 +5,8 @@ using PSManagement.Domain.Identity.Entities; ...@@ -5,6 +5,8 @@ using PSManagement.Domain.Identity.Entities;
using PSManagement.Domain.Projects.Entities; using PSManagement.Domain.Projects.Entities;
using PSManagement.Domain.Tracking; using PSManagement.Domain.Tracking;
using PSManagement.Domain.Tracking.Entities; using PSManagement.Domain.Tracking.Entities;
using PSManagement.Infrastructure.Persistence.SeedDataContext;
using PSManagement.SharedKernel.Entities;
namespace PSManagement.Infrastructure.Persistence namespace PSManagement.Infrastructure.Persistence
{ {
...@@ -37,6 +39,9 @@ namespace PSManagement.Infrastructure.Persistence ...@@ -37,6 +39,9 @@ namespace PSManagement.Infrastructure.Persistence
{ {
modelBuilder.ApplyConfigurationsFromAssembly(typeof(AppDbContext).Assembly); modelBuilder.ApplyConfigurationsFromAssembly(typeof(AppDbContext).Assembly);
// modelBuilder.Entity<BaseEntity>().Ignore(e => e.Events);
SeedData.SeedAsync(modelBuilder).Wait();
base.OnModelCreating(modelBuilder); base.OnModelCreating(modelBuilder);
......
...@@ -7,6 +7,8 @@ using PSManagement.Domain.Projects.Repositories; ...@@ -7,6 +7,8 @@ using PSManagement.Domain.Projects.Repositories;
using PSManagement.Infrastructure.Persistence.Repositories.CustomerRepository; using PSManagement.Infrastructure.Persistence.Repositories.CustomerRepository;
using PSManagement.Infrastructure.Persistence.Repositories.ProjectRepository; using PSManagement.Infrastructure.Persistence.Repositories.ProjectRepository;
using PSManagement.Infrastructure.Persistence.Repositories.UserRepository; using PSManagement.Infrastructure.Persistence.Repositories.UserRepository;
using PSManagement.Infrastructure.Persistence.UoW;
using PSManagement.SharedKernel.Interfaces;
namespace PSManagement.Infrastructure.Persistence.DI namespace PSManagement.Infrastructure.Persistence.DI
{ {
...@@ -23,6 +25,8 @@ namespace PSManagement.Infrastructure.Persistence.DI ...@@ -23,6 +25,8 @@ namespace PSManagement.Infrastructure.Persistence.DI
services.AddScoped<IProjectsRepository, ProjectsRepository>(); services.AddScoped<IProjectsRepository, ProjectsRepository>();
services.AddScoped<IUnitOfWork, UnitOfWork>();
return services; return services;
} }
......
...@@ -23,9 +23,6 @@ namespace PSManagement.Infrastructure.Persistence.EntitiesConfiguration ...@@ -23,9 +23,6 @@ namespace PSManagement.Infrastructure.Persistence.EntitiesConfiguration
} }
); );
builder.HasMany(e => e.Projects).WithOne(e => e.Proposer);
builder.OwnsMany(c => c.ContactInfo); builder.OwnsMany(c => c.ContactInfo);
} }
......
...@@ -5,10 +5,10 @@ using PSManagement.Domain.Projects.Entities; ...@@ -5,10 +5,10 @@ using PSManagement.Domain.Projects.Entities;
namespace PSManagement.Infrastructure.Persistence.EntitiesConfiguration namespace PSManagement.Infrastructure.Persistence.EntitiesConfiguration
{ {
public class FinicialSpendingEntityConfiguration : public class FinicialSpendingEntityConfiguration :
IEntityTypeConfiguration<FinincialSpending> IEntityTypeConfiguration<FinancialSpending>
{ {
public void Configure(EntityTypeBuilder<FinincialSpending> builder) public void Configure(EntityTypeBuilder<FinancialSpending> builder)
{ {
builder.OwnsOne(e => e.ExternalPurchase, p => builder.OwnsOne(e => e.ExternalPurchase, p =>
{ {
...@@ -17,13 +17,6 @@ namespace PSManagement.Infrastructure.Persistence.EntitiesConfiguration ...@@ -17,13 +17,6 @@ namespace PSManagement.Infrastructure.Persistence.EntitiesConfiguration
}); });
builder.OwnsOne(e => e.LocalPurchase, p =>
{
p.Property(e => e.Ammount).HasColumnName("LocalPurchaseAmmount");
p.Property(e => e.Currency).HasColumnName("LocalPurchaseCurrency").HasDefaultValue("SP");
});
} }
} }
} }
...@@ -31,6 +31,8 @@ namespace PSManagement.Infrastructure.Persistence.EntitiesConfiguration ...@@ -31,6 +31,8 @@ namespace PSManagement.Infrastructure.Persistence.EntitiesConfiguration
p.Property(e => e.Description).HasColumnName("Description"); p.Property(e => e.Description).HasColumnName("Description");
p.Property(e => e.Code).HasColumnName("Code"); p.Property(e => e.Code).HasColumnName("Code");
p.Property(e => e.Name).HasColumnName("Name"); p.Property(e => e.Name).HasColumnName("Name");
p.Property(e => e.StartDate).HasColumnName("StartDate");
p.Property(e => e.ExpectedEndDate).HasColumnName("ExpectedEndDate");
} }
...@@ -54,15 +56,15 @@ namespace PSManagement.Infrastructure.Persistence.EntitiesConfiguration ...@@ -54,15 +56,15 @@ namespace PSManagement.Infrastructure.Persistence.EntitiesConfiguration
p.Property(e => e.ProposingBookNumber).HasColumnName("ProposingBookNumber"); p.Property(e => e.ProposingBookNumber).HasColumnName("ProposingBookNumber");
} }
); );
builder.OwnsOne(c => c.FinincialFund, builder.OwnsOne(c => c.FinancialFund,
p => { p => {
p.Property(e => e.FinicialStatus).HasColumnName("FinicialStatus"); p.Property(e => e.FinancialStatus).HasColumnName("FinicialStatus");
p.Property(e => e.Source).HasColumnName("FinicialSource"); p.Property(e => e.Source).HasColumnName("FinicialSource");
} }
); );
builder.HasOne(e => e.ProjectStatus).WithMany(); builder.HasOne(e => e.ProjectStatus).WithMany();
builder.HasMany(e => e.FinincialSpending); builder.HasMany(e => e.FinancialSpending);
builder.HasMany(e => e.Tracks).WithOne(e => e.Project).HasForeignKey(e => e.ProjectId); builder.HasMany(e => e.Tracks).WithOne(e => e.Project).HasForeignKey(e => e.ProjectId);
} }
......
using Microsoft.EntityFrameworkCore.Migrations;
namespace PSManagement.Infrastructure.Persistence.Migrations
{
public partial class AddDomainsUpdate4 : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_FinincialSpending_Projects_ProjectId",
table: "FinincialSpending");
migrationBuilder.DropPrimaryKey(
name: "PK_FinincialSpending",
table: "FinincialSpending");
migrationBuilder.DropColumn(
name: "LocalPurchaseAmmount",
table: "FinincialSpending");
migrationBuilder.DropColumn(
name: "LocalPurchaseCurrency",
table: "FinincialSpending");
migrationBuilder.RenameTable(
name: "FinincialSpending",
newName: "FinancialSpending");
migrationBuilder.RenameIndex(
name: "IX_FinincialSpending_ProjectId",
table: "FinancialSpending",
newName: "IX_FinancialSpending_ProjectId");
migrationBuilder.AddColumn<int>(
name: "LocalPurchase",
table: "FinancialSpending",
type: "int",
nullable: false,
defaultValue: 0);
migrationBuilder.AddPrimaryKey(
name: "PK_FinancialSpending",
table: "FinancialSpending",
column: "Id");
migrationBuilder.InsertData(
table: "Departments",
columns: new[] { "Id", "Name" },
values: new object[] { 1, "قسم المعلوميات" });
migrationBuilder.InsertData(
table: "Departments",
columns: new[] { "Id", "Name" },
values: new object[] { 2, "قسم النظم الإلكترونيى" });
migrationBuilder.InsertData(
table: "Departments",
columns: new[] { "Id", "Name" },
values: new object[] { 3, "شؤون الطلاب" });
migrationBuilder.AddForeignKey(
name: "FK_FinancialSpending_Projects_ProjectId",
table: "FinancialSpending",
column: "ProjectId",
principalTable: "Projects",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_FinancialSpending_Projects_ProjectId",
table: "FinancialSpending");
migrationBuilder.DropPrimaryKey(
name: "PK_FinancialSpending",
table: "FinancialSpending");
migrationBuilder.DeleteData(
table: "Departments",
keyColumn: "Id",
keyValue: 1);
migrationBuilder.DeleteData(
table: "Departments",
keyColumn: "Id",
keyValue: 2);
migrationBuilder.DeleteData(
table: "Departments",
keyColumn: "Id",
keyValue: 3);
migrationBuilder.DropColumn(
name: "LocalPurchase",
table: "FinancialSpending");
migrationBuilder.RenameTable(
name: "FinancialSpending",
newName: "FinincialSpending");
migrationBuilder.RenameIndex(
name: "IX_FinancialSpending_ProjectId",
table: "FinincialSpending",
newName: "IX_FinincialSpending_ProjectId");
migrationBuilder.AddColumn<int>(
name: "LocalPurchaseAmmount",
table: "FinincialSpending",
type: "int",
nullable: true);
migrationBuilder.AddColumn<string>(
name: "LocalPurchaseCurrency",
table: "FinincialSpending",
type: "nvarchar(max)",
nullable: true,
defaultValue: "SP");
migrationBuilder.AddPrimaryKey(
name: "PK_FinincialSpending",
table: "FinincialSpending",
column: "Id");
migrationBuilder.AddForeignKey(
name: "FK_FinincialSpending_Projects_ProjectId",
table: "FinincialSpending",
column: "ProjectId",
principalTable: "Projects",
principalColumn: "Id",
onDelete: ReferentialAction.Restrict);
}
}
}
using System;
using Microsoft.EntityFrameworkCore.Migrations;
namespace PSManagement.Infrastructure.Persistence.Migrations
{
public partial class AddDomainsUpdate5 : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<DateTime>(
name: "ExpectedSpendingDate",
table: "FinancialSpending",
type: "datetime2",
nullable: false,
defaultValue: new DateTime(1, 1, 1, 0, 0, 0, 0, DateTimeKind.Unspecified));
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "ExpectedSpendingDate",
table: "FinancialSpending");
}
}
}
using System;
using Microsoft.EntityFrameworkCore.Migrations;
namespace PSManagement.Infrastructure.Persistence.Migrations
{
public partial class AddDomainsUpdate6 : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.AddColumn<DateTime>(
name: "ExpectedEndDate",
table: "Projects",
type: "datetime2",
nullable: true);
migrationBuilder.AddColumn<DateTime>(
name: "StartDate",
table: "Projects",
type: "datetime2",
nullable: true);
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "ExpectedEndDate",
table: "Projects");
migrationBuilder.DropColumn(
name: "StartDate",
table: "Projects");
}
}
}
...@@ -51,6 +51,23 @@ namespace PSManagement.Infrastructure.Persistence.Migrations ...@@ -51,6 +51,23 @@ namespace PSManagement.Infrastructure.Persistence.Migrations
b.HasKey("Id"); b.HasKey("Id");
b.ToTable("Departments"); b.ToTable("Departments");
b.HasData(
new
{
Id = 1,
Name = "قسم المعلوميات"
},
new
{
Id = 2,
Name = "قسم النظم الإلكترونيى"
},
new
{
Id = 3,
Name = "شؤون الطلاب"
});
}); });
modelBuilder.Entity("PSManagement.Domain.Employees.Entities.Employee", b => modelBuilder.Entity("PSManagement.Domain.Employees.Entities.Employee", b =>
...@@ -179,7 +196,7 @@ namespace PSManagement.Infrastructure.Persistence.Migrations ...@@ -179,7 +196,7 @@ namespace PSManagement.Infrastructure.Persistence.Migrations
b.ToTable("EmployeeParticipate"); b.ToTable("EmployeeParticipate");
}); });
modelBuilder.Entity("PSManagement.Domain.Projects.Entities.FinincialSpending", b => modelBuilder.Entity("PSManagement.Domain.Projects.Entities.FinancialSpending", b =>
{ {
b.Property<int>("Id") b.Property<int>("Id")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
...@@ -192,6 +209,12 @@ namespace PSManagement.Infrastructure.Persistence.Migrations ...@@ -192,6 +209,12 @@ namespace PSManagement.Infrastructure.Persistence.Migrations
b.Property<string>("Description") b.Property<string>("Description")
.HasColumnType("nvarchar(max)"); .HasColumnType("nvarchar(max)");
b.Property<DateTime>("ExpectedSpendingDate")
.HasColumnType("datetime2");
b.Property<int>("LocalPurchase")
.HasColumnType("int");
b.Property<int?>("ProjectId") b.Property<int?>("ProjectId")
.HasColumnType("int"); .HasColumnType("int");
...@@ -199,7 +222,7 @@ namespace PSManagement.Infrastructure.Persistence.Migrations ...@@ -199,7 +222,7 @@ namespace PSManagement.Infrastructure.Persistence.Migrations
b.HasIndex("ProjectId"); b.HasIndex("ProjectId");
b.ToTable("FinincialSpending"); b.ToTable("FinancialSpending");
}); });
modelBuilder.Entity("PSManagement.Domain.Projects.Entities.Project", b => modelBuilder.Entity("PSManagement.Domain.Projects.Entities.Project", b =>
...@@ -583,15 +606,15 @@ namespace PSManagement.Infrastructure.Persistence.Migrations ...@@ -583,15 +606,15 @@ namespace PSManagement.Infrastructure.Persistence.Migrations
b.Navigation("Project"); b.Navigation("Project");
}); });
modelBuilder.Entity("PSManagement.Domain.Projects.Entities.FinincialSpending", b => modelBuilder.Entity("PSManagement.Domain.Projects.Entities.FinancialSpending", b =>
{ {
b.HasOne("PSManagement.Domain.Projects.Entities.Project", null) b.HasOne("PSManagement.Domain.Projects.Entities.Project", null)
.WithMany("FinincialSpending") .WithMany("FinancialSpending")
.HasForeignKey("ProjectId"); .HasForeignKey("ProjectId");
b.OwnsOne("PSManagement.SharedKernel.ValueObjects.Money", "ExternalPurchase", b1 => b.OwnsOne("PSManagement.SharedKernel.ValueObjects.Money", "ExternalPurchase", b1 =>
{ {
b1.Property<int>("FinincialSpendingId") b1.Property<int>("FinancialSpendingId")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("int") .HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
...@@ -601,46 +624,20 @@ namespace PSManagement.Infrastructure.Persistence.Migrations ...@@ -601,46 +624,20 @@ namespace PSManagement.Infrastructure.Persistence.Migrations
.HasColumnName("ExternalPurchaseAmmount"); .HasColumnName("ExternalPurchaseAmmount");
b1.Property<string>("Currency") b1.Property<string>("Currency")
.ValueGeneratedOnAdd()
.HasColumnType("nvarchar(max)") .HasColumnType("nvarchar(max)")
.HasDefaultValue("USD") .HasDefaultValue("USD")
.HasColumnName("ExternalPurchaseCurrency"); .HasColumnName("ExternalPurchaseCurrency");
b1.HasKey("FinincialSpendingId"); b1.HasKey("FinancialSpendingId");
b1.ToTable("FinincialSpending");
b1.WithOwner()
.HasForeignKey("FinincialSpendingId");
});
b.OwnsOne("PSManagement.SharedKernel.ValueObjects.Money", "LocalPurchase", b1 =>
{
b1.Property<int>("FinincialSpendingId")
.ValueGeneratedOnAdd()
.HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b1.Property<int>("Ammount")
.HasColumnType("int")
.HasColumnName("LocalPurchaseAmmount");
b1.Property<string>("Currency")
.ValueGeneratedOnAdd()
.HasColumnType("nvarchar(max)")
.HasDefaultValue("SP")
.HasColumnName("LocalPurchaseCurrency");
b1.HasKey("FinincialSpendingId");
b1.ToTable("FinincialSpending"); b1.ToTable("FinancialSpending");
b1.WithOwner() b1.WithOwner()
.HasForeignKey("FinincialSpendingId"); .HasForeignKey("FinancialSpendingId");
}); });
b.Navigation("ExternalPurchase"); b.Navigation("ExternalPurchase");
b.Navigation("LocalPurchase");
}); });
modelBuilder.Entity("PSManagement.Domain.Projects.Entities.Project", b => modelBuilder.Entity("PSManagement.Domain.Projects.Entities.Project", b =>
...@@ -698,14 +695,14 @@ namespace PSManagement.Infrastructure.Persistence.Migrations ...@@ -698,14 +695,14 @@ namespace PSManagement.Infrastructure.Persistence.Migrations
.HasForeignKey("ProjectId"); .HasForeignKey("ProjectId");
}); });
b.OwnsOne("PSManagement.Domain.Projects.ValueObjects.FinincialFund", "FinincialFund", b1 => b.OwnsOne("PSManagement.Domain.Projects.ValueObjects.FinancialFund", "FinancialFund", b1 =>
{ {
b1.Property<int>("ProjectId") b1.Property<int>("ProjectId")
.ValueGeneratedOnAdd() .ValueGeneratedOnAdd()
.HasColumnType("int") .HasColumnType("int")
.HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn);
b1.Property<string>("FinicialStatus") b1.Property<string>("FinancialStatus")
.HasColumnType("nvarchar(max)") .HasColumnType("nvarchar(max)")
.HasColumnName("FinicialStatus"); .HasColumnName("FinicialStatus");
...@@ -736,10 +733,18 @@ namespace PSManagement.Infrastructure.Persistence.Migrations ...@@ -736,10 +733,18 @@ namespace PSManagement.Infrastructure.Persistence.Migrations
.HasColumnType("nvarchar(max)") .HasColumnType("nvarchar(max)")
.HasColumnName("Description"); .HasColumnName("Description");
b1.Property<DateTime>("ExpectedEndDate")
.HasColumnType("datetime2")
.HasColumnName("ExpectedEndDate");
b1.Property<string>("Name") b1.Property<string>("Name")
.HasColumnType("nvarchar(max)") .HasColumnType("nvarchar(max)")
.HasColumnName("Name"); .HasColumnName("Name");
b1.Property<DateTime>("StartDate")
.HasColumnType("datetime2")
.HasColumnName("StartDate");
b1.HasKey("ProjectId"); b1.HasKey("ProjectId");
b1.ToTable("Projects"); b1.ToTable("Projects");
...@@ -773,7 +778,7 @@ namespace PSManagement.Infrastructure.Persistence.Migrations ...@@ -773,7 +778,7 @@ namespace PSManagement.Infrastructure.Persistence.Migrations
b.Navigation("Executer"); b.Navigation("Executer");
b.Navigation("FinincialFund"); b.Navigation("FinancialFund");
b.Navigation("ProjectAggreement"); b.Navigation("ProjectAggreement");
...@@ -903,7 +908,7 @@ namespace PSManagement.Infrastructure.Persistence.Migrations ...@@ -903,7 +908,7 @@ namespace PSManagement.Infrastructure.Persistence.Migrations
b.Navigation("EmployeeParticipates"); b.Navigation("EmployeeParticipates");
b.Navigation("FinincialSpending"); b.Navigation("FinancialSpending");
b.Navigation("Steps"); b.Navigation("Steps");
......
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Logging;
using PSManagement.Domain.Employees.Entities;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
namespace PSManagement.Infrastructure.Persistence.SeedDataContext
{
public class SeedData
{
public static Task SeedAsync(ModelBuilder builder)
{
SeedDepartments(builder);
return Task.CompletedTask;
}
public static void SeedDepartments(ModelBuilder builder) {
builder.Entity<Department>().HasData(
new Department { Id = 1, Name = "قسم المعلوميات" },
new Department { Id = 2, Name = "قسم النظم الإلكترونيى" },
new Department { Id = 3, Name = "شؤون الطلاب" }
) ;
}
}
}
using MediatR;
using PSManagement.SharedKernel.Entities;
using PSManagement.SharedKernel.Events;
using PSManagement.SharedKernel.Interfaces;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
namespace PSManagement.Infrastructure.Persistence.UoW
{
public class UnitOfWork :IUnitOfWork
{
private readonly AppDbContext _dbContext;
private readonly IMediator _mediator;
public UnitOfWork(AppDbContext dbContext, IMediator mediator)
{
_dbContext = dbContext;
_mediator = mediator;
}
public async Task SaveChangesAsync(CancellationToken cancellationToken = default)
{
await DispatchEventsAsync();
await _dbContext.SaveChangesAsync(cancellationToken);
}
private async Task DispatchEventsAsync()
{
var processedDomainEvents = new List<IDomainEvent>();
var unprocessedDomainEvents = GetDomainEvents().AsEnumerable();
// this is needed incase another DomainEvent is published from a DomainEventHandler
while (unprocessedDomainEvents.Any())
{
await DispatchDomainEventsAsync(unprocessedDomainEvents);
processedDomainEvents.AddRange(unprocessedDomainEvents);
unprocessedDomainEvents = GetDomainEvents()
.Where(e => !processedDomainEvents.Contains(e))
.ToList();
}
ClearDomainEvents();
}
private List<IDomainEvent> GetDomainEvents()
{
var aggregateRoots = GetTrackedEntites();
return aggregateRoots
.SelectMany(x => x.Events)
.ToList();
}
private List<BaseEntity> GetTrackedEntites()
{
return _dbContext.ChangeTracker
.Entries<BaseEntity>()
.Where(x => x.Entity.Events != null && x.Entity.Events.Any())
.Select(e => e.Entity)
.ToList();
}
private async Task DispatchDomainEventsAsync(IEnumerable<IDomainEvent> domainEvents)
{
foreach (var domainEvent in domainEvents)
{
await _mediator.Publish(domainEvent);
}
}
private void ClearDomainEvents()
{
var aggregateRoots = GetTrackedEntites();
aggregateRoots.ForEach(aggregate => aggregate.ClearDomainEvents());
}
public void Dispose()
{
_dbContext.Dispose();
}
}
}
...@@ -26,4 +26,8 @@ ...@@ -26,4 +26,8 @@
<ProjectReference Include="..\PSManagement.Domain\PSManagement.Domain.csproj" /> <ProjectReference Include="..\PSManagement.Domain\PSManagement.Domain.csproj" />
</ItemGroup> </ItemGroup>
<ItemGroup>
<Folder Include="BackgroundServcies\" />
</ItemGroup>
</Project> </Project>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment