Browse Source

Removed OrderStatus table and added it as a column

Returned back enum approach instead of Enumeration
pull/95/head
malik masis 5 years ago
parent
commit
749c7789ea
  1. 3
      services/ordering/src/EShopOnAbp.OrderingService.Application.Contracts/Orders/OrderDto.cs
  2. 15
      services/ordering/src/EShopOnAbp.OrderingService.Application/Orders/OrderAppService.cs
  3. 12
      services/ordering/src/EShopOnAbp.OrderingService.Domain/Orders/Order.cs
  4. 51
      services/ordering/src/EShopOnAbp.OrderingService.Domain/Orders/OrderStatus.cs
  5. 37
      services/ordering/src/EShopOnAbp.OrderingService.EntityFrameworkCore/EntityFrameworkCore/OrderServiceDataSeedContributor.cs
  6. 39
      services/ordering/src/EShopOnAbp.OrderingService.EntityFrameworkCore/EntityFrameworkCore/OrderingServiceDbContext.cs
  7. 182
      services/ordering/src/EShopOnAbp.OrderingService.EntityFrameworkCore/Migrations/20220317123922_RemovedOrderStatusTable.Designer.cs
  8. 73
      services/ordering/src/EShopOnAbp.OrderingService.EntityFrameworkCore/Migrations/20220317123922_RemovedOrderStatusTable.cs
  9. 36
      services/ordering/src/EShopOnAbp.OrderingService.EntityFrameworkCore/Migrations/OrderingServiceDbContextModelSnapshot.cs
  10. 14
      services/ordering/src/EShopOnAbp.OrderingService.EntityFrameworkCore/Orders/EfCoreOrderRepository.cs
  11. 3
      services/ordering/src/EShopOnAbp.OrderingService.EntityFrameworkCore/Orders/OrderEfCoreQueryableExtensions.cs
  12. 19
      services/ordering/test/EShopOnAbp.OrderingService.EntityFrameworkCore.Tests/EntityFrameworkCore/Orders/OrderRepository_Tests.cs

3
services/ordering/src/EShopOnAbp.OrderingService.Application.Contracts/Orders/OrderDto.cs

@ -7,8 +7,7 @@ namespace EShopOnAbp.OrderingService.Orders;
public class OrderDto : EntityDto<Guid>
{
public DateTime OrderDate { get; set; }
public int OrderNo {get;set;}
public int OrderStatusId { get; set; }
public int OrderNo { get; set; }
public string OrderStatus { get; set; }
public string PaymentMethod { get; set; }
public BuyerDto Buyer { get; set; }

15
services/ordering/src/EShopOnAbp.OrderingService.Application/Orders/OrderAppService.cs

@ -1,9 +1,9 @@
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using EShopOnAbp.OrderingService.Localization;
using EShopOnAbp.OrderingService.Localization;
using EShopOnAbp.OrderingService.Orders.Specifications;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using Volo.Abp.Application.Services;
using Volo.Abp.Specifications;
using Volo.Abp.Users;
@ -34,9 +34,9 @@ public class OrderAppService : ApplicationService, IOrderAppService
public async Task<List<OrderDto>> GetMyOrdersAsync(GetMyOrdersInput input)
{
ISpecification<Order> specification = SpecificationFactory.Create(input.Filter);
var orders = await _orderRepository.GetOrdersByUserId(CurrentUser.GetId(), specification, true);
return CreateOrderDtoMapping(orders);
}
@ -106,8 +106,7 @@ public class OrderAppService : ApplicationService, IOrderAppService
Id = order.Id,
OrderNo = order.OrderNo,
OrderDate = order.OrderDate,
OrderStatus = order.OrderStatus.Name,
OrderStatusId = order.OrderStatus.Id,
OrderStatus = order.OrderStatus.ToString(),
PaymentMethod = order.PaymentMethod
};
}

12
services/ordering/src/EShopOnAbp.OrderingService.Domain/Orders/Order.cs

@ -1,8 +1,8 @@
using System;
using EShopOnAbp.PaymentService.PaymentRequests;
using JetBrains.Annotations;
using System;
using System.Collections.Generic;
using System.Linq;
using EShopOnAbp.PaymentService.PaymentRequests;
using JetBrains.Annotations;
using Volo.Abp;
using Volo.Abp.Domain.Entities;
@ -10,7 +10,6 @@ namespace EShopOnAbp.OrderingService.Orders;
public class Order : AggregateRoot<Guid>
{
private int _orderStatusId;
public DateTime OrderDate { get; private set; }
public int OrderNo { get; private set; }
public string PaymentMethod { get; private set; }
@ -25,15 +24,14 @@ public class Order : AggregateRoot<Guid>
{
}
internal Order(Guid id, Buyer buyer, Address address, [NotNull]string paymentMethod, Guid? paymentRequestId = null) : base(id)
internal Order(Guid id, Buyer buyer, Address address, [NotNull] string paymentMethod, Guid? paymentRequestId = null) : base(id)
{
_orderStatusId = OrderStatus.Placed.Id;
OrderDate = DateTime.UtcNow;
OrderNo = GenerateOrderNo(id);
Buyer = buyer;
Address = address;
PaymentRequestId = paymentRequestId;
PaymentMethod = Check.NotNullOrEmpty(paymentMethod,nameof(paymentMethod),maxLength:OrderConstants.OrderPaymentMethodNameMaxLength);
PaymentMethod = Check.NotNullOrEmpty(paymentMethod, nameof(paymentMethod), maxLength: OrderConstants.OrderPaymentMethodNameMaxLength);
PaymentStatus = PaymentRequestState.Waiting.ToString(); // From PaymentService.Domain.Shared
OrderItems = new List<OrderItem>();
}

51
services/ordering/src/EShopOnAbp.OrderingService.Domain/Orders/OrderStatus.cs

@ -1,48 +1,9 @@
using System;
using System.Collections.Generic;
using System.Linq;
using Volo.Abp;
namespace EShopOnAbp.OrderingService.Orders;
namespace EShopOnAbp.OrderingService.Orders;
public class OrderStatus : Enumeration
public enum OrderStatus
{
public static OrderStatus Placed = new OrderStatus(1, nameof(Placed).ToLowerInvariant());
public static OrderStatus Paid = new OrderStatus(2, nameof(Paid).ToLowerInvariant());
public static OrderStatus Shipped = new OrderStatus(3, nameof(Shipped).ToLowerInvariant());
public static OrderStatus Cancelled = new OrderStatus(4, nameof(Cancelled).ToLowerInvariant());
public OrderStatus(int id, string name) : base(id, name)
{
}
public static IEnumerable<OrderStatus> List() =>
new[] {Placed, Paid, Shipped, Cancelled};
public static OrderStatus FromName(string name)
{
var state = List()
.SingleOrDefault(s => String.Equals(s.Name, name, StringComparison.CurrentCultureIgnoreCase));
if (state == null)
{
throw new BusinessException(OrderingServiceErrorCodes.OrderingStatusNotFound)
.WithData("OrderStatus", String.Join(",", List().Select(s => s.Name)));
}
return state;
}
public static OrderStatus From(int id)
{
var state = List().SingleOrDefault(s => s.Id == id);
if (state == null)
{
throw new BusinessException(OrderingServiceErrorCodes.OrderingStatusNotFound)
.WithData("OrderStatus", String.Join(",", List().Select(s => s.Name)));
}
return state;
}
Placed,
Paid,
Shipped,
Cancelled
}

37
services/ordering/src/EShopOnAbp.OrderingService.EntityFrameworkCore/EntityFrameworkCore/OrderServiceDataSeedContributor.cs

@ -1,37 +0,0 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using EShopOnAbp.OrderingService.Orders;
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Data;
using Volo.Abp.DependencyInjection;
namespace EShopOnAbp.OrderingService.EntityFrameworkCore;
/// <summary>
/// DataSeedContributor for seeding pre-exist order status data.
/// This is a sample for seeding data without DbSet (non-aggregate data), without using repository.
/// </summary>
public class OrderServiceDataSeedContributor : IDataSeedContributor, ITransientDependency
{
private readonly IOrderingServiceDbContext _dbContext;
public OrderServiceDataSeedContributor(IOrderingServiceDbContext dbContext)
{
_dbContext = dbContext;
}
public async Task SeedAsync(DataSeedContext context)
{
await SeedOrderStatusAsync();
}
private async Task SeedOrderStatusAsync()
{
if (!await _dbContext.Set<OrderStatus>().AnyAsync())
{
await _dbContext.Set<OrderStatus>().AddRangeAsync(OrderStatus.List());
await _dbContext.SaveChangesAsync();
}
}
}

39
services/ordering/src/EShopOnAbp.OrderingService.EntityFrameworkCore/EntityFrameworkCore/OrderingServiceDbContext.cs

@ -1,6 +1,9 @@
using System;
using EShopOnAbp.OrderingService.Orders;
using EShopOnAbp.OrderingService.Orders;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using System;
using System.Data;
using System.Reflection.Emit;
using Volo.Abp.Data;
using Volo.Abp.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore.Modeling;
@ -38,15 +41,17 @@ public class OrderingServiceDbContext : AbpDbContext<OrderingServiceDbContext>,
b.OwnsOne(o => o.Address, a => { a.WithOwner(); });
b.OwnsOne(o => o.Buyer, a => { a.WithOwner(); });
b.Property<int>("_orderStatusId").UsePropertyAccessMode(PropertyAccessMode.Field)
.HasColumnName("OrderStatusId")
.IsRequired();
b.HasOne(q => q.OrderStatus).WithMany().HasForeignKey("_orderStatusId");
b.Navigation(q => q.OrderItems).UsePropertyAccessMode(PropertyAccessMode.Property);
b.Property(q => q.OrderStatus).HasConversion<string>();
//b.Property(e => e.OrderStatus).HasConversion(
// v => v.ToString(),
// v => (OrderStatus)Enum.Parse(typeof(OrderStatus), v));
});
builder.Entity<OrderItem>(b =>
{
b.ToTable(OrderingServiceDbProperties.DbTablePrefix + "OrderItems",
@ -62,23 +67,5 @@ public class OrderingServiceDbContext : AbpDbContext<OrderingServiceDbContext>,
b.Property(q => q.Units).IsRequired();
b.Property(q => q.PictureUrl).IsRequired(false);
});
builder.Entity<OrderStatus>(b =>
{
b.ToTable(OrderingServiceDbProperties.DbTablePrefix + "OrderStatus",
OrderingServiceDbProperties.DbSchema);
b.ConfigureByConvention(); //auto configure for the base class props
b.HasKey(q => q.Id);
b.Property(q => q.Id)
.HasDefaultValue(1)
.ValueGeneratedNever()
.IsRequired();
b.Property(o => o.Name)
.HasMaxLength(OrderConstants.OrderStatusNameMaxLength)
.IsRequired();
});
}
}

182
services/ordering/src/EShopOnAbp.OrderingService.EntityFrameworkCore/Migrations/20220317123922_RemovedOrderStatusTable.Designer.cs

@ -0,0 +1,182 @@
// <auto-generated />
using System;
using EShopOnAbp.OrderingService.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Infrastructure;
using Microsoft.EntityFrameworkCore.Migrations;
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
using Volo.Abp.EntityFrameworkCore;
#nullable disable
namespace EShopOnAbp.OrderingService.Migrations
{
[DbContext(typeof(OrderingServiceDbContext))]
[Migration("20220317123922_RemovedOrderStatusTable")]
partial class RemovedOrderStatusTable
{
protected override void BuildTargetModel(ModelBuilder modelBuilder)
{
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.PostgreSql)
.HasAnnotation("ProductVersion", "6.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
modelBuilder.Entity("EShopOnAbp.OrderingService.Orders.Order", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uuid");
b.Property<string>("ConcurrencyStamp")
.IsConcurrencyToken()
.HasMaxLength(40)
.HasColumnType("character varying(40)")
.HasColumnName("ConcurrencyStamp");
b.Property<string>("ExtraProperties")
.HasColumnType("text")
.HasColumnName("ExtraProperties");
b.Property<DateTime>("OrderDate")
.HasColumnType("timestamp without time zone");
b.Property<int>("OrderNo")
.HasColumnType("integer");
b.Property<string>("OrderStatus")
.IsRequired()
.HasColumnType("text");
b.Property<string>("PaymentMethod")
.IsRequired()
.HasMaxLength(128)
.HasColumnType("character varying(128)");
b.Property<Guid?>("PaymentRequestId")
.HasColumnType("uuid");
b.Property<string>("PaymentStatus")
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.HasKey("Id");
b.ToTable("Orders", (string)null);
});
modelBuilder.Entity("EShopOnAbp.OrderingService.Orders.OrderItem", b =>
{
b.Property<Guid>("Id")
.HasColumnType("uuid");
b.Property<decimal>("Discount")
.HasColumnType("numeric");
b.Property<Guid>("OrderId")
.HasColumnType("uuid");
b.Property<string>("PictureUrl")
.HasColumnType("text");
b.Property<string>("ProductCode")
.IsRequired()
.HasColumnType("text");
b.Property<Guid>("ProductId")
.HasColumnType("uuid");
b.Property<string>("ProductName")
.IsRequired()
.HasColumnType("text");
b.Property<decimal>("UnitPrice")
.HasColumnType("numeric");
b.Property<int>("Units")
.HasColumnType("integer");
b.HasKey("Id");
b.HasIndex("OrderId");
b.ToTable("OrderItems", (string)null);
});
modelBuilder.Entity("EShopOnAbp.OrderingService.Orders.Order", b =>
{
b.OwnsOne("EShopOnAbp.OrderingService.Orders.Address", "Address", b1 =>
{
b1.Property<Guid>("OrderId")
.HasColumnType("uuid");
b1.Property<string>("City")
.HasColumnType("text");
b1.Property<string>("Country")
.HasColumnType("text");
b1.Property<string>("Description")
.HasColumnType("text");
b1.Property<string>("Street")
.HasColumnType("text");
b1.Property<string>("ZipCode")
.HasColumnType("text");
b1.HasKey("OrderId");
b1.ToTable("Orders");
b1.WithOwner()
.HasForeignKey("OrderId");
});
b.OwnsOne("EShopOnAbp.OrderingService.Orders.Buyer", "Buyer", b1 =>
{
b1.Property<Guid>("OrderId")
.HasColumnType("uuid");
b1.Property<string>("Email")
.HasColumnType("text");
b1.Property<Guid?>("Id")
.HasColumnType("uuid");
b1.Property<string>("Name")
.HasColumnType("text");
b1.HasKey("OrderId");
b1.ToTable("Orders");
b1.WithOwner()
.HasForeignKey("OrderId");
});
b.Navigation("Address");
b.Navigation("Buyer");
});
modelBuilder.Entity("EShopOnAbp.OrderingService.Orders.OrderItem", b =>
{
b.HasOne("EShopOnAbp.OrderingService.Orders.Order", null)
.WithMany("OrderItems")
.HasForeignKey("OrderId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
});
modelBuilder.Entity("EShopOnAbp.OrderingService.Orders.Order", b =>
{
b.Navigation("OrderItems");
});
#pragma warning restore 612, 618
}
}
}

73
services/ordering/src/EShopOnAbp.OrderingService.EntityFrameworkCore/Migrations/20220317123922_RemovedOrderStatusTable.cs

@ -0,0 +1,73 @@
using Microsoft.EntityFrameworkCore.Migrations;
#nullable disable
namespace EShopOnAbp.OrderingService.Migrations
{
public partial class RemovedOrderStatusTable : Migration
{
protected override void Up(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropForeignKey(
name: "FK_Orders_OrderStatus_OrderStatusId",
table: "Orders");
migrationBuilder.DropTable(
name: "OrderStatus");
migrationBuilder.DropIndex(
name: "IX_Orders_OrderStatusId",
table: "Orders");
migrationBuilder.DropColumn(
name: "OrderStatusId",
table: "Orders");
migrationBuilder.AddColumn<string>(
name: "OrderStatus",
table: "Orders",
type: "text",
nullable: false,
defaultValue: "");
}
protected override void Down(MigrationBuilder migrationBuilder)
{
migrationBuilder.DropColumn(
name: "OrderStatus",
table: "Orders");
migrationBuilder.AddColumn<int>(
name: "OrderStatusId",
table: "Orders",
type: "integer",
nullable: false,
defaultValue: 0);
migrationBuilder.CreateTable(
name: "OrderStatus",
columns: table => new
{
Id = table.Column<int>(type: "integer", nullable: false, defaultValue: 1),
Name = table.Column<string>(type: "character varying(256)", maxLength: 256, nullable: false)
},
constraints: table =>
{
table.PrimaryKey("PK_OrderStatus", x => x.Id);
});
migrationBuilder.CreateIndex(
name: "IX_Orders_OrderStatusId",
table: "Orders",
column: "OrderStatusId");
migrationBuilder.AddForeignKey(
name: "FK_Orders_OrderStatus_OrderStatusId",
table: "Orders",
column: "OrderStatusId",
principalTable: "OrderStatus",
principalColumn: "Id",
onDelete: ReferentialAction.Cascade);
}
}
}

36
services/ordering/src/EShopOnAbp.OrderingService.EntityFrameworkCore/Migrations/OrderingServiceDbContextModelSnapshot.cs

@ -19,7 +19,7 @@ namespace EShopOnAbp.OrderingService.Migrations
#pragma warning disable 612, 618
modelBuilder
.HasAnnotation("_Abp_DatabaseProvider", EfCoreDatabaseProvider.PostgreSql)
.HasAnnotation("ProductVersion", "6.0.0")
.HasAnnotation("ProductVersion", "6.0.1")
.HasAnnotation("Relational:MaxIdentifierLength", 63);
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
@ -45,6 +45,10 @@ namespace EShopOnAbp.OrderingService.Migrations
b.Property<int>("OrderNo")
.HasColumnType("integer");
b.Property<string>("OrderStatus")
.IsRequired()
.HasColumnType("text");
b.Property<string>("PaymentMethod")
.IsRequired()
.HasMaxLength(128)
@ -57,14 +61,8 @@ namespace EShopOnAbp.OrderingService.Migrations
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.Property<int>("_orderStatusId")
.HasColumnType("integer")
.HasColumnName("OrderStatusId");
b.HasKey("Id");
b.HasIndex("_orderStatusId");
b.ToTable("Orders", (string)null);
});
@ -106,30 +104,8 @@ namespace EShopOnAbp.OrderingService.Migrations
b.ToTable("OrderItems", (string)null);
});
modelBuilder.Entity("EShopOnAbp.OrderingService.Orders.OrderStatus", b =>
{
b.Property<int>("Id")
.HasColumnType("integer")
.HasDefaultValue(1);
b.Property<string>("Name")
.IsRequired()
.HasMaxLength(256)
.HasColumnType("character varying(256)");
b.HasKey("Id");
b.ToTable("OrderStatus", (string)null);
});
modelBuilder.Entity("EShopOnAbp.OrderingService.Orders.Order", b =>
{
b.HasOne("EShopOnAbp.OrderingService.Orders.OrderStatus", "OrderStatus")
.WithMany()
.HasForeignKey("_orderStatusId")
.OnDelete(DeleteBehavior.Cascade)
.IsRequired();
b.OwnsOne("EShopOnAbp.OrderingService.Orders.Address", "Address", b1 =>
{
b1.Property<Guid>("OrderId")
@ -183,8 +159,6 @@ namespace EShopOnAbp.OrderingService.Migrations
b.Navigation("Address");
b.Navigation("Buyer");
b.Navigation("OrderStatus");
});
modelBuilder.Entity("EShopOnAbp.OrderingService.Orders.OrderItem", b =>

14
services/ordering/src/EShopOnAbp.OrderingService.EntityFrameworkCore/Orders/EfCoreOrderRepository.cs

@ -1,11 +1,11 @@
using System;
using EShopOnAbp.OrderingService.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Linq.Dynamic.Core;
using System.Threading;
using System.Threading.Tasks;
using EShopOnAbp.OrderingService.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore;
using Volo.Abp.Domain.Entities;
using Volo.Abp.Domain.Repositories.EntityFrameworkCore;
using Volo.Abp.EntityFrameworkCore;
@ -20,14 +20,6 @@ public class EfCoreOrderRepository : EfCoreRepository<OrderingServiceDbContext,
{
}
public override async Task<Order> InsertAsync(Order entity, bool autoSave = false,
CancellationToken cancellationToken = default)
{
var newEntity = await base.InsertAsync(entity, autoSave, GetCancellationToken(cancellationToken));
await EnsurePropertyLoadedAsync(newEntity, o => o.OrderStatus, GetCancellationToken(cancellationToken));
return newEntity;
}
public async Task<List<Order>> GetOrdersByUserId(
Guid userId,
ISpecification<Order> spec,

3
services/ordering/src/EShopOnAbp.OrderingService.EntityFrameworkCore/Orders/OrderEfCoreQueryableExtensions.cs

@ -15,7 +15,6 @@ public static class OrderEfCoreQueryableExtensions
return queryable
.Include(x => x.Address)
.Include(x => x.Buyer)
.Include(x => x.OrderItems)
.Include(x => x.OrderStatus);
.Include(x => x.OrderItems);
}
}

19
services/ordering/test/EShopOnAbp.OrderingService.EntityFrameworkCore.Tests/EntityFrameworkCore/Orders/OrderRepository_Tests.cs

@ -1,12 +1,11 @@
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using EShopOnAbp.OrderingService.Orders;
using EShopOnAbp.OrderingService.Orders;
using EShopOnAbp.OrderingService.Orders.Specifications;
using EShopOnAbp.OrderingService.Samples;
using Microsoft.EntityFrameworkCore;
using Shouldly;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using Xunit;
namespace EShopOnAbp.OrderingService.EntityFrameworkCore.Orders;
@ -26,14 +25,6 @@ public class OrderRepository_Tests : SampleRepository_Tests<OrderingServiceEntit
_testData = GetRequiredService<TestData>();
}
[Fact]
public async Task Should_Get_OrderStatus()
{
var dbSet = _dbContext.Set<OrderStatus>();
var statusList = await dbSet.ToListAsync();
statusList.Count.ShouldNotBe(0);
}
[Fact]
public async Task Should_Get_User_Orders()
{

Loading…
Cancel
Save