diff options
-rw-r--r-- | Controllers/RafflesController.cs | 2 | ||||
-rw-r--r-- | Migrations/20221122224441_AddTicket.Designer.cs | 367 | ||||
-rw-r--r-- | Migrations/20221122224441_AddTicket.cs | 60 | ||||
-rw-r--r-- | Migrations/ApplicationDbContextModelSnapshot.cs | 61 | ||||
-rw-r--r-- | Models/ApplicationDbContext.cs | 1 | ||||
-rw-r--r-- | Models/Raffle.cs | 1 | ||||
-rw-r--r-- | Models/Ticket.cs | 17 | ||||
-rw-r--r-- | Models/UserAccount.cs | 1 |
8 files changed, 508 insertions, 2 deletions
diff --git a/Controllers/RafflesController.cs b/Controllers/RafflesController.cs index 775ef3b..32604bb 100644 --- a/Controllers/RafflesController.cs +++ b/Controllers/RafflesController.cs @@ -21,7 +21,7 @@ namespace BackendPIA.Controllers { } [HttpGet] - public async Task<IEnumerable<Raffle>> Get([FromQuery] string name = "") { + public async Task<IEnumerable<Raffle>> Index([FromQuery] string name = "") { return await _service.GetRaffles(name); } diff --git a/Migrations/20221122224441_AddTicket.Designer.cs b/Migrations/20221122224441_AddTicket.Designer.cs new file mode 100644 index 0000000..bf4f985 --- /dev/null +++ b/Migrations/20221122224441_AddTicket.Designer.cs @@ -0,0 +1,367 @@ +// <auto-generated /> +using System; +using BackendPIA.Models; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace BackendPIA.Migrations +{ + [DbContext(typeof(ApplicationDbContext))] + [Migration("20221122224441_AddTicket")] + partial class AddTicket + { + /// <inheritdoc /> + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "7.0.0") + .HasAnnotation("Relational:MaxIdentifierLength", 63); + + NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder); + + modelBuilder.Entity("BackendPIA.Models.Raffle", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id")); + + b.Property<bool>("IsClosed") + .HasColumnType("boolean"); + + b.Property<string>("Name") + .IsRequired() + .HasMaxLength(128) + .HasColumnType("character varying(128)"); + + b.Property<int>("Winners") + .HasColumnType("integer"); + + b.HasKey("Id"); + + b.ToTable("Raffles"); + }); + + modelBuilder.Entity("BackendPIA.Models.Ticket", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id")); + + b.Property<bool>("IsWinner") + .HasColumnType("boolean"); + + b.Property<int>("Number") + .HasColumnType("integer"); + + b.Property<string>("OwnerId") + .HasColumnType("text"); + + b.Property<long>("RaffleId") + .HasColumnType("bigint"); + + b.Property<long>("UserAccountId") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("OwnerId"); + + b.HasIndex("RaffleId"); + + b.ToTable("Tickets"); + }); + + modelBuilder.Entity("BackendPIA.Models.UserAccount", b => + { + b.Property<string>("Id") + .HasColumnType("text"); + + b.Property<int>("AccessFailedCount") + .HasColumnType("integer"); + + b.Property<string>("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property<string>("Email") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property<bool>("EmailConfirmed") + .HasColumnType("boolean"); + + b.Property<bool>("LockoutEnabled") + .HasColumnType("boolean"); + + b.Property<DateTimeOffset?>("LockoutEnd") + .HasColumnType("timestamp with time zone"); + + b.Property<string>("NormalizedEmail") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property<string>("NormalizedUserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property<string>("PasswordHash") + .HasColumnType("text"); + + b.Property<string>("PhoneNumber") + .HasColumnType("text"); + + b.Property<bool>("PhoneNumberConfirmed") + .HasColumnType("boolean"); + + b.Property<string>("SecurityStamp") + .HasColumnType("text"); + + b.Property<string>("SessionToken") + .HasMaxLength(64) + .HasColumnType("character varying(64)"); + + b.Property<DateTime?>("SessionTokenExpiryTime") + .HasColumnType("timestamp with time zone"); + + b.Property<bool>("TwoFactorEnabled") + .HasColumnType("boolean"); + + b.Property<string>("UserName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasDatabaseName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasDatabaseName("UserNameIndex"); + + b.ToTable("AspNetUsers", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property<string>("Id") + .HasColumnType("text"); + + b.Property<string>("ConcurrencyStamp") + .IsConcurrencyToken() + .HasColumnType("text"); + + b.Property<string>("Name") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.Property<string>("NormalizedName") + .HasMaxLength(256) + .HasColumnType("character varying(256)"); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasDatabaseName("RoleNameIndex"); + + b.ToTable("AspNetRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id")); + + b.Property<string>("ClaimType") + .HasColumnType("text"); + + b.Property<string>("ClaimValue") + .HasColumnType("text"); + + b.Property<string>("RoleId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b => + { + b.Property<int>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("integer"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<int>("Id")); + + b.Property<string>("ClaimType") + .HasColumnType("text"); + + b.Property<string>("ClaimValue") + .HasColumnType("text"); + + b.Property<string>("UserId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b => + { + b.Property<string>("LoginProvider") + .HasColumnType("text"); + + b.Property<string>("ProviderKey") + .HasColumnType("text"); + + b.Property<string>("ProviderDisplayName") + .HasColumnType("text"); + + b.Property<string>("UserId") + .IsRequired() + .HasColumnType("text"); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b => + { + b.Property<string>("UserId") + .HasColumnType("text"); + + b.Property<string>("RoleId") + .HasColumnType("text"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles", (string)null); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b => + { + b.Property<string>("UserId") + .HasColumnType("text"); + + b.Property<string>("LoginProvider") + .HasColumnType("text"); + + b.Property<string>("Name") + .HasColumnType("text"); + + b.Property<string>("Value") + .HasColumnType("text"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens", (string)null); + }); + + modelBuilder.Entity("BackendPIA.Models.Ticket", b => + { + b.HasOne("BackendPIA.Models.UserAccount", "Owner") + .WithMany("Tickets") + .HasForeignKey("OwnerId"); + + b.HasOne("BackendPIA.Models.Raffle", "Raffle") + .WithMany("Tickets") + .HasForeignKey("RaffleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + + b.Navigation("Raffle"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim<string>", b => + { + b.HasOne("BackendPIA.Models.UserAccount", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin<string>", b => + { + b.HasOne("BackendPIA.Models.UserAccount", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole<string>", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.HasOne("BackendPIA.Models.UserAccount", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken<string>", b => + { + b.HasOne("BackendPIA.Models.UserAccount", null) + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + }); + + modelBuilder.Entity("BackendPIA.Models.Raffle", b => + { + b.Navigation("Tickets"); + }); + + modelBuilder.Entity("BackendPIA.Models.UserAccount", b => + { + b.Navigation("Tickets"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Migrations/20221122224441_AddTicket.cs b/Migrations/20221122224441_AddTicket.cs new file mode 100644 index 0000000..d74f927 --- /dev/null +++ b/Migrations/20221122224441_AddTicket.cs @@ -0,0 +1,60 @@ +using Microsoft.EntityFrameworkCore.Migrations; +using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata; + +#nullable disable + +namespace BackendPIA.Migrations +{ + /// <inheritdoc /> + public partial class AddTicket : Migration + { + /// <inheritdoc /> + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.CreateTable( + name: "Tickets", + columns: table => new + { + Id = table.Column<long>(type: "bigint", nullable: false) + .Annotation("Npgsql:ValueGenerationStrategy", NpgsqlValueGenerationStrategy.IdentityByDefaultColumn), + Number = table.Column<int>(type: "integer", nullable: false), + IsWinner = table.Column<bool>(type: "boolean", nullable: false), + UserAccountId = table.Column<long>(type: "bigint", nullable: false), + RaffleId = table.Column<long>(type: "bigint", nullable: false), + OwnerId = table.Column<string>(type: "text", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_Tickets", x => x.Id); + table.ForeignKey( + name: "FK_Tickets_AspNetUsers_OwnerId", + column: x => x.OwnerId, + principalTable: "AspNetUsers", + principalColumn: "Id"); + table.ForeignKey( + name: "FK_Tickets_Raffles_RaffleId", + column: x => x.RaffleId, + principalTable: "Raffles", + principalColumn: "Id", + onDelete: ReferentialAction.Cascade); + }); + + migrationBuilder.CreateIndex( + name: "IX_Tickets_OwnerId", + table: "Tickets", + column: "OwnerId"); + + migrationBuilder.CreateIndex( + name: "IX_Tickets_RaffleId", + table: "Tickets", + column: "RaffleId"); + } + + /// <inheritdoc /> + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropTable( + name: "Tickets"); + } + } +} diff --git a/Migrations/ApplicationDbContextModelSnapshot.cs b/Migrations/ApplicationDbContextModelSnapshot.cs index 9fceb51..556a52f 100644 --- a/Migrations/ApplicationDbContextModelSnapshot.cs +++ b/Migrations/ApplicationDbContextModelSnapshot.cs @@ -43,7 +43,39 @@ namespace BackendPIA.Migrations b.HasKey("Id"); - b.ToTable("Raffles", (string)null); + b.ToTable("Raffles"); + }); + + modelBuilder.Entity("BackendPIA.Models.Ticket", b => + { + b.Property<long>("Id") + .ValueGeneratedOnAdd() + .HasColumnType("bigint"); + + NpgsqlPropertyBuilderExtensions.UseIdentityByDefaultColumn(b.Property<long>("Id")); + + b.Property<bool>("IsWinner") + .HasColumnType("boolean"); + + b.Property<int>("Number") + .HasColumnType("integer"); + + b.Property<string>("OwnerId") + .HasColumnType("text"); + + b.Property<long>("RaffleId") + .HasColumnType("bigint"); + + b.Property<long>("UserAccountId") + .HasColumnType("bigint"); + + b.HasKey("Id"); + + b.HasIndex("OwnerId"); + + b.HasIndex("RaffleId"); + + b.ToTable("Tickets"); }); modelBuilder.Entity("BackendPIA.Models.UserAccount", b => @@ -249,6 +281,23 @@ namespace BackendPIA.Migrations b.ToTable("AspNetUserTokens", (string)null); }); + modelBuilder.Entity("BackendPIA.Models.Ticket", b => + { + b.HasOne("BackendPIA.Models.UserAccount", "Owner") + .WithMany("Tickets") + .HasForeignKey("OwnerId"); + + b.HasOne("BackendPIA.Models.Raffle", "Raffle") + .WithMany("Tickets") + .HasForeignKey("RaffleId") + .OnDelete(DeleteBehavior.Cascade) + .IsRequired(); + + b.Navigation("Owner"); + + b.Navigation("Raffle"); + }); + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim<string>", b => { b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole", null) @@ -299,6 +348,16 @@ namespace BackendPIA.Migrations .OnDelete(DeleteBehavior.Cascade) .IsRequired(); }); + + modelBuilder.Entity("BackendPIA.Models.Raffle", b => + { + b.Navigation("Tickets"); + }); + + modelBuilder.Entity("BackendPIA.Models.UserAccount", b => + { + b.Navigation("Tickets"); + }); #pragma warning restore 612, 618 } } diff --git a/Models/ApplicationDbContext.cs b/Models/ApplicationDbContext.cs index 07907c7..80eb64e 100644 --- a/Models/ApplicationDbContext.cs +++ b/Models/ApplicationDbContext.cs @@ -4,6 +4,7 @@ using Microsoft.EntityFrameworkCore; namespace BackendPIA.Models { public class ApplicationDbContext : IdentityDbContext<UserAccount> { public DbSet<Raffle>? Raffles { get; set; } + public DbSet<Ticket>? Tickets { get; set; } public ApplicationDbContext(DbContextOptions<ApplicationDbContext> options) : base(options) {} diff --git a/Models/Raffle.cs b/Models/Raffle.cs index 6e2640d..ebd8e8b 100644 --- a/Models/Raffle.cs +++ b/Models/Raffle.cs @@ -10,5 +10,6 @@ namespace BackendPIA.Models { [Range(1, 54, ErrorMessage = "Value for {0} must be between {1} and {2}.")] public int Winners { get; set; } public bool IsClosed { get; set; } + public ICollection<Ticket>? Tickets { get; set; } } }
\ No newline at end of file diff --git a/Models/Ticket.cs b/Models/Ticket.cs new file mode 100644 index 0000000..e459027 --- /dev/null +++ b/Models/Ticket.cs @@ -0,0 +1,17 @@ +using System.ComponentModel.DataAnnotations; + +namespace BackendPIA.Models { + public class Ticket { + public long Id { get; set; } + [Required] + [Range(1, 54, ErrorMessage = "Value for {0} must be between {1} and {2}.")] + public int Number { get; set; } + public bool IsWinner { get; set; } + [Required] + public long UserAccountId { get; set; } + [Required] + public long RaffleId { get; set; } + public UserAccount? Owner { get; set; } + public Raffle? Raffle { get; set; } + } +}
\ No newline at end of file diff --git a/Models/UserAccount.cs b/Models/UserAccount.cs index 8b70187..333138d 100644 --- a/Models/UserAccount.cs +++ b/Models/UserAccount.cs @@ -6,5 +6,6 @@ namespace BackendPIA.Models { [StringLength(64)] public string? SessionToken { get; set; } public DateTime? SessionTokenExpiryTime { get; set; } + public ICollection<Ticket>? Tickets { get; set; } } }
\ No newline at end of file |