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 @@
+
+