diff --git a/Data/DataModel/EventAdmins.cs b/Data/DataModel/EventAdmins.cs index bbcb66fa..27a391d9 100644 --- a/Data/DataModel/EventAdmins.cs +++ b/Data/DataModel/EventAdmins.cs @@ -11,7 +11,7 @@ public class EventAdmins /// Foreign key - event table /// /// Foreign key - user table diff --git a/Data/DataModel/EventOwners.cs b/Data/DataModel/EventOwners.cs deleted file mode 100644 index c69df6b5..00000000 --- a/Data/DataModel/EventOwners.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.ComponentModel.DataAnnotations.Schema; - -namespace ServerCore.DataModel -{ - /// - /// The users who are owners for this event - /// - public class EventOwners - { - // ID for row - [DatabaseGenerated(DatabaseGeneratedOption.Identity)] - public int ID { get; set; } - - /// - /// Foreign Key - event table - /// - [ForeignKey("Event.ID")] - public virtual Event Event { get; set; } - - /// - /// Foreign Key - user table (owner) - /// - [ForeignKey("User.ID")] - public virtual PuzzleUser Owner { get; set; } - } -} diff --git a/Data/DataModel/PuzzleUser.cs b/Data/DataModel/PuzzleUser.cs index f4b81f9c..e5c2242d 100644 --- a/Data/DataModel/PuzzleUser.cs +++ b/Data/DataModel/PuzzleUser.cs @@ -1,4 +1,5 @@ -using System.ComponentModel.DataAnnotations; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; using System.Linq; using Microsoft.AspNetCore.Identity; @@ -32,5 +33,25 @@ public static PuzzleUser GetPuzzleUser(string identityUserId, PuzzleServerContex { return dbContext.PuzzleUsers.Where(user => user.IdentityUserId == identityUserId).FirstOrDefault(); } + + /// + /// Returns whether or not a user is an author for the given event + /// + /// The event that's being checked + /// Current PuzzleServerContext + public bool IsAuthorForEvent(PuzzleServerContext puzzleServerContext, Event thisEvent) + { + return puzzleServerContext.EventAuthors.Where(a => a.Author.ID == ID && a.Event.ID == thisEvent.ID).Any(); + } + + /// + /// Returns whether or not a user is an admin for the given event + /// + /// The event that's being checked + /// Current PuzzleServerContext + public bool IsAdminForEvent (PuzzleServerContext dbContext, Event thisEvent) + { + return dbContext.EventAdmins.Where(a => a.Admin.ID == ID && a.Event.ID == thisEvent.ID).Any(); + } } } diff --git a/Data/IPuzzleServerContext.cs b/Data/IPuzzleServerContext.cs index 5f1a6622..06f2991c 100644 --- a/Data/IPuzzleServerContext.cs +++ b/Data/IPuzzleServerContext.cs @@ -7,7 +7,6 @@ public interface IPuzzleServerContext DbSet Events { get; set; } DbSet EventAdmins { get; set; } DbSet EventAuthors { get; set; } - DbSet EventOwners { get; set; } DbSet EventTeams { get; set; } DbSet Feedback { get; set; } DbSet Invitations { get; set; } diff --git a/Data/Migrations/20181108042647_RemoveEventOwners.Designer.cs b/Data/Migrations/20181108042647_RemoveEventOwners.Designer.cs new file mode 100644 index 00000000..7fdb1c8d --- /dev/null +++ b/Data/Migrations/20181108042647_RemoveEventOwners.Designer.cs @@ -0,0 +1,806 @@ +// +using System; +using Microsoft.EntityFrameworkCore; +using Microsoft.EntityFrameworkCore.Infrastructure; +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; +using Microsoft.EntityFrameworkCore.Storage.ValueConversion; +using ServerCore.DataModel; + +namespace Data.Migrations +{ + [DbContext(typeof(PuzzleServerContext))] + [Migration("20181108042647_RemoveEventOwners")] + partial class RemoveEventOwners + { + protected override void BuildTargetModel(ModelBuilder modelBuilder) + { +#pragma warning disable 612, 618 + modelBuilder + .HasAnnotation("ProductVersion", "2.1.1-rtm-30846") + .HasAnnotation("Relational:MaxIdentifierLength", 128) + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRole", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Name") + .HasMaxLength(256); + + b.Property("NormalizedName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedName") + .IsUnique() + .HasName("RoleNameIndex") + .HasFilter("[NormalizedName] IS NOT NULL"); + + b.ToTable("AspNetRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("RoleId") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetRoleClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUser", b => + { + b.Property("Id") + .ValueGeneratedOnAdd(); + + b.Property("AccessFailedCount"); + + b.Property("ConcurrencyStamp") + .IsConcurrencyToken(); + + b.Property("Email") + .HasMaxLength(256); + + b.Property("EmailConfirmed"); + + b.Property("LockoutEnabled"); + + b.Property("LockoutEnd"); + + b.Property("NormalizedEmail") + .HasMaxLength(256); + + b.Property("NormalizedUserName") + .HasMaxLength(256); + + b.Property("PasswordHash"); + + b.Property("PhoneNumber"); + + b.Property("PhoneNumberConfirmed"); + + b.Property("SecurityStamp"); + + b.Property("TwoFactorEnabled"); + + b.Property("UserName") + .HasMaxLength(256); + + b.HasKey("Id"); + + b.HasIndex("NormalizedEmail") + .HasName("EmailIndex"); + + b.HasIndex("NormalizedUserName") + .IsUnique() + .HasName("UserNameIndex") + .HasFilter("[NormalizedUserName] IS NOT NULL"); + + b.ToTable("AspNetUsers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.Property("Id") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("ClaimType"); + + b.Property("ClaimValue"); + + b.Property("UserId") + .IsRequired(); + + b.HasKey("Id"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserClaims"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.Property("LoginProvider") + .HasMaxLength(128); + + b.Property("ProviderKey") + .HasMaxLength(128); + + b.Property("ProviderDisplayName"); + + b.Property("UserId") + .IsRequired(); + + b.HasKey("LoginProvider", "ProviderKey"); + + b.HasIndex("UserId"); + + b.ToTable("AspNetUserLogins"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.Property("UserId"); + + b.Property("RoleId"); + + b.HasKey("UserId", "RoleId"); + + b.HasIndex("RoleId"); + + b.ToTable("AspNetUserRoles"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.Property("UserId"); + + b.Property("LoginProvider") + .HasMaxLength(128); + + b.Property("Name") + .HasMaxLength(128); + + b.Property("Value"); + + b.HasKey("UserId", "LoginProvider", "Name"); + + b.ToTable("AspNetUserTokens"); + }); + + modelBuilder.Entity("ServerCore.DataModel.ContentFile", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("EventID"); + + b.Property("FileType"); + + b.Property("PuzzleID") + .IsRequired(); + + b.Property("ShortName") + .IsRequired(); + + b.Property("UrlString") + .IsRequired(); + + b.HasKey("ID"); + + b.HasIndex("PuzzleID"); + + b.HasIndex("EventID", "ShortName") + .IsUnique(); + + b.ToTable("ContentFiles"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Event", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("AllowFeedback"); + + b.Property("AnswerSubmissionEnd"); + + b.Property("AnswersAvailableBegin"); + + b.Property("ContactEmail"); + + b.Property("EventBegin"); + + b.Property("IsInternEvent"); + + b.Property("MaxExternalsPerTeam"); + + b.Property("MaxNumberOfTeams"); + + b.Property("MaxTeamSize"); + + b.Property("Name") + .IsRequired(); + + b.Property("ShowFastestSolves"); + + b.Property("StandingsAvailableBegin"); + + b.Property("StandingsOverride"); + + b.Property("TeamDeleteEnd"); + + b.Property("TeamMembershipChangeEnd"); + + b.Property("TeamMiscDataChangeEnd"); + + b.Property("TeamNameChangeEnd"); + + b.Property("TeamRegistrationBegin"); + + b.Property("TeamRegistrationEnd"); + + b.Property("UrlString"); + + b.HasKey("ID"); + + b.ToTable("Events"); + }); + + modelBuilder.Entity("ServerCore.DataModel.EventAdmins", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Event.ID"); + + b.Property("User.ID"); + + b.HasKey("ID"); + + b.HasIndex("Event.ID") + .IsUnique() + .HasFilter("[Event.ID] IS NOT NULL"); + + b.HasIndex("User.ID"); + + b.ToTable("EventAdmins"); + }); + + modelBuilder.Entity("ServerCore.DataModel.EventAuthors", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Event.ID"); + + b.Property("User.ID"); + + b.HasKey("ID"); + + b.HasIndex("Event.ID") + .IsUnique() + .HasFilter("[Event.ID] IS NOT NULL"); + + b.HasIndex("User.ID"); + + b.ToTable("EventAuthors"); + }); + + modelBuilder.Entity("ServerCore.DataModel.EventTeams", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Event.ID"); + + b.Property("Teams.ID"); + + b.HasKey("ID"); + + b.HasIndex("Event.ID") + .IsUnique() + .HasFilter("[Event.ID] IS NOT NULL"); + + b.HasIndex("Teams.ID"); + + b.ToTable("EventTeams"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Feedback", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Difficulty"); + + b.Property("Fun"); + + b.Property("PuzzleID"); + + b.Property("SubmissionTime"); + + b.Property("SubmitterID"); + + b.Property("WrittenFeedback"); + + b.HasKey("ID"); + + b.HasIndex("PuzzleID"); + + b.HasIndex("SubmitterID"); + + b.ToTable("Feedback"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Invitation", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("EmailAddress"); + + b.Property("Expiration"); + + b.Property("InvitationCode"); + + b.Property("InvitationType"); + + b.Property("TeamID"); + + b.HasKey("ID"); + + b.HasIndex("TeamID"); + + b.ToTable("Invitations"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Prerequisites", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("PrerequisiteID"); + + b.Property("PuzzleID"); + + b.HasKey("ID"); + + b.HasIndex("PrerequisiteID"); + + b.HasIndex("PuzzleID"); + + b.ToTable("Prerequisites"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Puzzle", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("EventID"); + + b.Property("Group"); + + b.Property("IsFinalPuzzle"); + + b.Property("IsGloballyVisiblePrerequisite"); + + b.Property("IsMetaPuzzle"); + + b.Property("IsPuzzle"); + + b.Property("MinPrerequisiteCount"); + + b.Property("Name") + .IsRequired(); + + b.Property("OrderInGroup"); + + b.Property("SolveValue"); + + b.Property("Token"); + + b.HasKey("ID"); + + b.HasIndex("EventID"); + + b.ToTable("Puzzles"); + }); + + modelBuilder.Entity("ServerCore.DataModel.PuzzleAuthors", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Puzzle.ID"); + + b.Property("User.ID"); + + b.HasKey("ID"); + + b.HasIndex("Puzzle.ID"); + + b.HasIndex("User.ID"); + + b.ToTable("PuzzleAuthors"); + }); + + modelBuilder.Entity("ServerCore.DataModel.PuzzleStatePerTeam", b => + { + b.Property("PuzzleID"); + + b.Property("TeamID"); + + b.Property("Notes"); + + b.Property("Printed"); + + b.Property("SolvedTime"); + + b.Property("UnlockedTime"); + + b.HasKey("PuzzleID", "TeamID"); + + b.HasIndex("TeamID"); + + b.ToTable("PuzzleStatePerTeam"); + }); + + modelBuilder.Entity("ServerCore.DataModel.PuzzleUser", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Email"); + + b.Property("EmployeeAlias"); + + b.Property("IdentityUserId") + .IsRequired(); + + b.Property("Name"); + + b.Property("PhoneNumber"); + + b.Property("TShirtSize"); + + b.Property("VisibleToOthers"); + + b.HasKey("ID"); + + b.ToTable("PuzzleUsers"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Response", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("IsSolution"); + + b.Property("Note"); + + b.Property("PuzzleID"); + + b.Property("ResponseText") + .IsRequired(); + + b.Property("SubmittedText") + .IsRequired(); + + b.HasKey("ID"); + + b.HasIndex("PuzzleID"); + + b.ToTable("Responses"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Submission", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("PuzzleID"); + + b.Property("ResponseID"); + + b.Property("SubmissionText"); + + b.Property("SubmitterID"); + + b.Property("TeamID"); + + b.Property("TimeSubmitted"); + + b.HasKey("ID"); + + b.HasIndex("PuzzleID"); + + b.HasIndex("ResponseID"); + + b.HasIndex("SubmitterID"); + + b.HasIndex("TeamID"); + + b.ToTable("Submissions"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Team", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("CustomRoom"); + + b.Property("EventID"); + + b.Property("Name"); + + b.Property("PrimaryContactEmail"); + + b.Property("PrimaryPhoneNumber"); + + b.Property("RoomID"); + + b.Property("SecondaryPhoneNumber"); + + b.HasKey("ID"); + + b.HasIndex("EventID"); + + b.ToTable("Teams"); + }); + + modelBuilder.Entity("ServerCore.DataModel.TeamMembers", b => + { + b.Property("ID") + .ValueGeneratedOnAdd() + .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); + + b.Property("Team.ID"); + + b.Property("User.ID"); + + b.HasKey("ID"); + + b.HasIndex("Team.ID"); + + b.HasIndex("User.ID"); + + b.ToTable("TeamMembers"); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityRoleClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserClaim", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserLogin", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserRole", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityRole") + .WithMany() + .HasForeignKey("RoleId") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("Microsoft.AspNetCore.Identity.IdentityUserToken", b => + { + b.HasOne("Microsoft.AspNetCore.Identity.IdentityUser") + .WithMany() + .HasForeignKey("UserId") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ServerCore.DataModel.ContentFile", b => + { + b.HasOne("ServerCore.DataModel.Event", "Event") + .WithMany() + .HasForeignKey("EventID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") + .WithMany("Contents") + .HasForeignKey("PuzzleID") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ServerCore.DataModel.EventAdmins", b => + { + b.HasOne("ServerCore.DataModel.Event", "Event") + .WithOne("Admins") + .HasForeignKey("ServerCore.DataModel.EventAdmins", "Event.ID"); + + b.HasOne("ServerCore.DataModel.PuzzleUser", "Admin") + .WithMany() + .HasForeignKey("User.ID"); + }); + + modelBuilder.Entity("ServerCore.DataModel.EventAuthors", b => + { + b.HasOne("ServerCore.DataModel.Event", "Event") + .WithOne("Authors") + .HasForeignKey("ServerCore.DataModel.EventAuthors", "Event.ID"); + + b.HasOne("ServerCore.DataModel.PuzzleUser", "Author") + .WithMany() + .HasForeignKey("User.ID"); + }); + + modelBuilder.Entity("ServerCore.DataModel.EventTeams", b => + { + b.HasOne("ServerCore.DataModel.Event", "Event") + .WithOne("Teams") + .HasForeignKey("ServerCore.DataModel.EventTeams", "Event.ID"); + + b.HasOne("ServerCore.DataModel.Team", "Team") + .WithMany() + .HasForeignKey("Teams.ID"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Feedback", b => + { + b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") + .WithMany() + .HasForeignKey("PuzzleID"); + + b.HasOne("ServerCore.DataModel.PuzzleUser", "Submitter") + .WithMany() + .HasForeignKey("SubmitterID"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Invitation", b => + { + b.HasOne("ServerCore.DataModel.Team") + .WithMany("Invitations") + .HasForeignKey("TeamID"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Prerequisites", b => + { + b.HasOne("ServerCore.DataModel.Puzzle", "Prerequisite") + .WithMany() + .HasForeignKey("PrerequisiteID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") + .WithMany() + .HasForeignKey("PuzzleID") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ServerCore.DataModel.Puzzle", b => + { + b.HasOne("ServerCore.DataModel.Event", "Event") + .WithMany() + .HasForeignKey("EventID"); + }); + + modelBuilder.Entity("ServerCore.DataModel.PuzzleAuthors", b => + { + b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") + .WithMany() + .HasForeignKey("Puzzle.ID"); + + b.HasOne("ServerCore.DataModel.PuzzleUser", "Author") + .WithMany() + .HasForeignKey("User.ID"); + }); + + modelBuilder.Entity("ServerCore.DataModel.PuzzleStatePerTeam", b => + { + b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") + .WithMany() + .HasForeignKey("PuzzleID") + .OnDelete(DeleteBehavior.Cascade); + + b.HasOne("ServerCore.DataModel.Team", "Team") + .WithMany() + .HasForeignKey("TeamID") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ServerCore.DataModel.Response", b => + { + b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") + .WithMany() + .HasForeignKey("PuzzleID") + .OnDelete(DeleteBehavior.Cascade); + }); + + modelBuilder.Entity("ServerCore.DataModel.Submission", b => + { + b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") + .WithMany() + .HasForeignKey("PuzzleID"); + + b.HasOne("ServerCore.DataModel.Response", "Response") + .WithMany() + .HasForeignKey("ResponseID"); + + b.HasOne("ServerCore.DataModel.PuzzleUser", "Submitter") + .WithMany() + .HasForeignKey("SubmitterID"); + + b.HasOne("ServerCore.DataModel.Team", "Team") + .WithMany() + .HasForeignKey("TeamID"); + }); + + modelBuilder.Entity("ServerCore.DataModel.Team", b => + { + b.HasOne("ServerCore.DataModel.Event", "Event") + .WithMany() + .HasForeignKey("EventID"); + }); + + modelBuilder.Entity("ServerCore.DataModel.TeamMembers", b => + { + b.HasOne("ServerCore.DataModel.Team", "Team") + .WithMany() + .HasForeignKey("Team.ID"); + + b.HasOne("ServerCore.DataModel.PuzzleUser", "Member") + .WithMany() + .HasForeignKey("User.ID"); + }); +#pragma warning restore 612, 618 + } + } +} diff --git a/Data/Migrations/20181108042647_RemoveEventOwners.cs b/Data/Migrations/20181108042647_RemoveEventOwners.cs new file mode 100644 index 00000000..4585dea4 --- /dev/null +++ b/Data/Migrations/20181108042647_RemoveEventOwners.cs @@ -0,0 +1,201 @@ +using Microsoft.EntityFrameworkCore.Metadata; +using Microsoft.EntityFrameworkCore.Migrations; + +namespace Data.Migrations +{ + public partial class RemoveEventOwners : Migration + { + protected override void Up(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_EventAdmins_EventOwners_Event.ID", + table: "EventAdmins"); + + migrationBuilder.DropForeignKey( + name: "FK_Events_EventAdmins_AdminsID", + table: "Events"); + + migrationBuilder.DropForeignKey( + name: "FK_Prerequisites_Puzzles_PrerequisiteID", + table: "Prerequisites"); + + migrationBuilder.DropForeignKey( + name: "FK_Prerequisites_Puzzles_PuzzleID", + table: "Prerequisites"); + + migrationBuilder.DropTable( + name: "EventOwners"); + + migrationBuilder.DropIndex( + name: "IX_Events_AdminsID", + table: "Events"); + + migrationBuilder.DropIndex( + name: "IX_EventAdmins_Event.ID", + table: "EventAdmins"); + + migrationBuilder.DropColumn( + name: "AdminsID", + table: "Events"); + + migrationBuilder.AlterColumn( + name: "PuzzleID", + table: "Prerequisites", + nullable: false, + oldClrType: typeof(int), + oldNullable: true); + + migrationBuilder.AlterColumn( + name: "PrerequisiteID", + table: "Prerequisites", + nullable: false, + oldClrType: typeof(int), + oldNullable: true); + + migrationBuilder.CreateIndex( + name: "IX_EventAdmins_Event.ID", + table: "EventAdmins", + column: "Event.ID", + unique: true, + filter: "[Event.ID] IS NOT NULL"); + + migrationBuilder.AddForeignKey( + name: "FK_EventAdmins_Events_Event.ID", + table: "EventAdmins", + column: "Event.ID", + principalTable: "Events", + principalColumn: "ID", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_Prerequisites_Puzzles_PrerequisiteID", + table: "Prerequisites", + column: "PrerequisiteID", + principalTable: "Puzzles", + principalColumn: "ID", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_Prerequisites_Puzzles_PuzzleID", + table: "Prerequisites", + column: "PuzzleID", + principalTable: "Puzzles", + principalColumn: "ID", + onDelete: ReferentialAction.Restrict); + } + + protected override void Down(MigrationBuilder migrationBuilder) + { + migrationBuilder.DropForeignKey( + name: "FK_EventAdmins_Events_Event.ID", + table: "EventAdmins"); + + migrationBuilder.DropForeignKey( + name: "FK_Prerequisites_Puzzles_PrerequisiteID", + table: "Prerequisites"); + + migrationBuilder.DropForeignKey( + name: "FK_Prerequisites_Puzzles_PuzzleID", + table: "Prerequisites"); + + migrationBuilder.DropIndex( + name: "IX_EventAdmins_Event.ID", + table: "EventAdmins"); + + migrationBuilder.AlterColumn( + name: "PuzzleID", + table: "Prerequisites", + nullable: true, + oldClrType: typeof(int)); + + migrationBuilder.AlterColumn( + name: "PrerequisiteID", + table: "Prerequisites", + nullable: true, + oldClrType: typeof(int)); + + migrationBuilder.AddColumn( + name: "AdminsID", + table: "Events", + nullable: true); + + migrationBuilder.CreateTable( + name: "EventOwners", + columns: table => new + { + ID = table.Column(nullable: false) + .Annotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn), + EventID = table.Column(name: "Event.ID", nullable: true), + UserID = table.Column(name: "User.ID", nullable: true) + }, + constraints: table => + { + table.PrimaryKey("PK_EventOwners", x => x.ID); + table.ForeignKey( + name: "FK_EventOwners_Events_Event.ID", + column: x => x.EventID, + principalTable: "Events", + principalColumn: "ID", + onDelete: ReferentialAction.Restrict); + table.ForeignKey( + name: "FK_EventOwners_PuzzleUsers_User.ID", + column: x => x.UserID, + principalTable: "PuzzleUsers", + principalColumn: "ID", + onDelete: ReferentialAction.Restrict); + }); + + migrationBuilder.CreateIndex( + name: "IX_Events_AdminsID", + table: "Events", + column: "AdminsID"); + + migrationBuilder.CreateIndex( + name: "IX_EventAdmins_Event.ID", + table: "EventAdmins", + column: "Event.ID"); + + migrationBuilder.CreateIndex( + name: "IX_EventOwners_Event.ID", + table: "EventOwners", + column: "Event.ID"); + + migrationBuilder.CreateIndex( + name: "IX_EventOwners_User.ID", + table: "EventOwners", + column: "User.ID"); + + migrationBuilder.AddForeignKey( + name: "FK_EventAdmins_EventOwners_Event.ID", + table: "EventAdmins", + column: "Event.ID", + principalTable: "EventOwners", + principalColumn: "ID", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_Events_EventAdmins_AdminsID", + table: "Events", + column: "AdminsID", + principalTable: "EventAdmins", + principalColumn: "ID", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_Prerequisites_Puzzles_PrerequisiteID", + table: "Prerequisites", + column: "PrerequisiteID", + principalTable: "Puzzles", + principalColumn: "ID", + onDelete: ReferentialAction.Restrict); + + migrationBuilder.AddForeignKey( + name: "FK_Prerequisites_Puzzles_PuzzleID", + table: "Prerequisites", + column: "PuzzleID", + principalTable: "Puzzles", + principalColumn: "ID", + onDelete: ReferentialAction.Restrict); + } + } +} diff --git a/Data/Migrations/PuzzleServerContextModelSnapshot.cs b/Data/Migrations/PuzzleServerContextModelSnapshot.cs index b994b32e..7408b5d0 100644 --- a/Data/Migrations/PuzzleServerContextModelSnapshot.cs +++ b/Data/Migrations/PuzzleServerContextModelSnapshot.cs @@ -15,7 +15,7 @@ protected override void BuildModel(ModelBuilder modelBuilder) { #pragma warning disable 612, 618 modelBuilder - .HasAnnotation("ProductVersion", "2.1.3-rtm-32065") + .HasAnnotation("ProductVersion", "2.1.1-rtm-30846") .HasAnnotation("Relational:MaxIdentifierLength", 128) .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); @@ -219,8 +219,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) .ValueGeneratedOnAdd() .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - b.Property("AdminsID"); - b.Property("AllowFeedback"); b.Property("AnswerSubmissionEnd"); @@ -264,8 +262,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("ID"); - b.HasIndex("AdminsID"); - b.ToTable("Events"); }); @@ -281,7 +277,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.HasKey("ID"); - b.HasIndex("Event.ID"); + b.HasIndex("Event.ID") + .IsUnique() + .HasFilter("[Event.ID] IS NOT NULL"); b.HasIndex("User.ID"); @@ -309,25 +307,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) b.ToTable("EventAuthors"); }); - modelBuilder.Entity("ServerCore.DataModel.EventOwners", b => - { - b.Property("ID") - .ValueGeneratedOnAdd() - .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - - b.Property("Event.ID"); - - b.Property("User.ID"); - - b.HasKey("ID"); - - b.HasIndex("Event.ID"); - - b.HasIndex("User.ID"); - - b.ToTable("EventOwners"); - }); - modelBuilder.Entity("ServerCore.DataModel.EventTeams", b => { b.Property("ID") @@ -405,9 +384,9 @@ protected override void BuildModel(ModelBuilder modelBuilder) .ValueGeneratedOnAdd() .HasAnnotation("SqlServer:ValueGenerationStrategy", SqlServerValueGenerationStrategy.IdentityColumn); - b.Property("PrerequisiteID"); + b.Property("PrerequisiteID"); - b.Property("PuzzleID"); + b.Property("PuzzleID"); b.HasKey("ID"); @@ -680,18 +659,11 @@ protected override void BuildModel(ModelBuilder modelBuilder) .OnDelete(DeleteBehavior.Cascade); }); - modelBuilder.Entity("ServerCore.DataModel.Event", b => - { - b.HasOne("ServerCore.DataModel.EventAdmins", "Admins") - .WithMany() - .HasForeignKey("AdminsID"); - }); - modelBuilder.Entity("ServerCore.DataModel.EventAdmins", b => { - b.HasOne("ServerCore.DataModel.EventOwners", "Event") - .WithMany() - .HasForeignKey("Event.ID"); + b.HasOne("ServerCore.DataModel.Event", "Event") + .WithOne("Admins") + .HasForeignKey("ServerCore.DataModel.EventAdmins", "Event.ID"); b.HasOne("ServerCore.DataModel.PuzzleUser", "Admin") .WithMany() @@ -709,17 +681,6 @@ protected override void BuildModel(ModelBuilder modelBuilder) .HasForeignKey("User.ID"); }); - modelBuilder.Entity("ServerCore.DataModel.EventOwners", b => - { - b.HasOne("ServerCore.DataModel.Event", "Event") - .WithMany() - .HasForeignKey("Event.ID"); - - b.HasOne("ServerCore.DataModel.PuzzleUser", "Owner") - .WithMany() - .HasForeignKey("User.ID"); - }); - modelBuilder.Entity("ServerCore.DataModel.EventTeams", b => { b.HasOne("ServerCore.DataModel.Event", "Event") @@ -753,11 +714,13 @@ protected override void BuildModel(ModelBuilder modelBuilder) { b.HasOne("ServerCore.DataModel.Puzzle", "Prerequisite") .WithMany() - .HasForeignKey("PrerequisiteID"); + .HasForeignKey("PrerequisiteID") + .OnDelete(DeleteBehavior.Cascade); b.HasOne("ServerCore.DataModel.Puzzle", "Puzzle") .WithMany() - .HasForeignKey("PuzzleID"); + .HasForeignKey("PuzzleID") + .OnDelete(DeleteBehavior.Cascade); }); modelBuilder.Entity("ServerCore.DataModel.Puzzle", b => diff --git a/Data/PuzzleServerContext.cs b/Data/PuzzleServerContext.cs index ecd9b3a3..1dc22100 100644 --- a/Data/PuzzleServerContext.cs +++ b/Data/PuzzleServerContext.cs @@ -18,7 +18,6 @@ public PuzzleServerContext(DbContextOptions options) public DbSet Events { get; set; } public DbSet EventAdmins { get; set; } public DbSet EventAuthors { get; set; } - public DbSet EventOwners { get; set; } public DbSet EventTeams { get; set; } public DbSet Feedback { get; set; } public DbSet Invitations { get; set; } diff --git a/ServerCore/AuthorDashboardHelper.cs b/ServerCore/AuthorDashboardHelper.cs new file mode 100644 index 00000000..136db486 --- /dev/null +++ b/ServerCore/AuthorDashboardHelper.cs @@ -0,0 +1,19 @@ +using System.Collections.Generic; +using System.Linq; +using ServerCore.DataModel; + +namespace ServerCore +{ + public class AuthorDashboardHelper + { + /// + /// Returns a list of the author's puzzles for the given event + /// + /// The event that's being checked + /// Current PuzzleServerContext + public List GetPuzzlesForAuthorAndEvent(PuzzleServerContext dbContext, PuzzleUser user, Event thisEvent) + { + return dbContext.PuzzleAuthors.Where(pa => pa.Author.ID == user.ID && pa.Puzzle.Event.ID == thisEvent.ID).Select(pa => pa.Puzzle).ToList(); + } + } +} diff --git a/ServerCore/ServerCore.csproj b/ServerCore/ServerCore.csproj index def46a3f..940e84ca 100644 --- a/ServerCore/ServerCore.csproj +++ b/ServerCore/ServerCore.csproj @@ -34,6 +34,8 @@ + +