Working game creation with publishers, developers, genres, and tags
This commit is contained in:
parent
ddc68277b1
commit
3ae5971122
6 changed files with 116 additions and 30 deletions
|
@ -242,7 +242,61 @@ namespace LANCommander.Controllers
|
||||||
{
|
{
|
||||||
if (ModelState.IsValid)
|
if (ModelState.IsValid)
|
||||||
{
|
{
|
||||||
await GameService.Add(viewModel.Game);
|
var game = await GameService.Add(viewModel.Game);
|
||||||
|
|
||||||
|
if (viewModel.SelectedDevelopers != null && viewModel.SelectedDevelopers.Length > 0)
|
||||||
|
{
|
||||||
|
if (game.Developers == null)
|
||||||
|
game.Developers = new List<Company>();
|
||||||
|
|
||||||
|
foreach (var selectedDeveloper in viewModel.SelectedDevelopers)
|
||||||
|
{
|
||||||
|
var company = await CompanyService.AddMissing(c => c.Name == selectedDeveloper, new Company() { Name = selectedDeveloper });
|
||||||
|
|
||||||
|
game.Developers.Add(company);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (viewModel.SelectedPublishers != null && viewModel.SelectedPublishers.Length > 0)
|
||||||
|
{
|
||||||
|
if (game.Publishers == null)
|
||||||
|
game.Publishers = new List<Company>();
|
||||||
|
|
||||||
|
foreach (var selectedPublisher in viewModel.SelectedPublishers)
|
||||||
|
{
|
||||||
|
var company = await CompanyService.AddMissing(c => c.Name == selectedPublisher, new Company() { Name = selectedPublisher });
|
||||||
|
|
||||||
|
game.Publishers.Add(company);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (viewModel.SelectedGenres != null && viewModel.SelectedGenres.Length > 0)
|
||||||
|
{
|
||||||
|
if (game.Genres == null)
|
||||||
|
game.Genres = new List<Genre>();
|
||||||
|
|
||||||
|
foreach (var selectedGenre in viewModel.SelectedGenres)
|
||||||
|
{
|
||||||
|
var genre = await GenreService.AddMissing(g => g.Name == selectedGenre, new Genre() { Name = selectedGenre });
|
||||||
|
|
||||||
|
game.Genres.Add(genre);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (viewModel.SelectedTags != null && viewModel.SelectedTags.Length > 0)
|
||||||
|
{
|
||||||
|
if (game.Tags == null)
|
||||||
|
game.Tags = new List<Tag>();
|
||||||
|
|
||||||
|
foreach (var selectedTag in viewModel.SelectedTags)
|
||||||
|
{
|
||||||
|
var tag = await TagService.AddMissing(g => g.Name == selectedTag, new Tag() { Name = selectedTag });
|
||||||
|
|
||||||
|
game.Tags.Add(tag);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
await GameService.Update(game);
|
||||||
|
|
||||||
return RedirectToAction(nameof(Index));
|
return RedirectToAction(nameof(Index));
|
||||||
}
|
}
|
||||||
|
@ -266,7 +320,7 @@ namespace LANCommander.Controllers
|
||||||
// For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
|
// For more details, see http://go.microsoft.com/fwlink/?LinkId=317598.
|
||||||
[HttpPost]
|
[HttpPost]
|
||||||
[ValidateAntiForgeryToken]
|
[ValidateAntiForgeryToken]
|
||||||
public async Task<IActionResult> Edit(Guid id, [Bind("Title,SortTitle,Description,ReleasedOn,Id,CreatedOn,CreatedById,UpdatedOn,UpdatedById")] Game game)
|
public async Task<IActionResult> Edit(Guid id, Game game)
|
||||||
{
|
{
|
||||||
if (id != game.Id)
|
if (id != game.Id)
|
||||||
{
|
{
|
||||||
|
|
|
@ -16,16 +16,16 @@ namespace LANCommander.Data.Models
|
||||||
[Display(Name = "Released On")]
|
[Display(Name = "Released On")]
|
||||||
public DateTime? ReleasedOn { get; set; }
|
public DateTime? ReleasedOn { get; set; }
|
||||||
|
|
||||||
public virtual ICollection<Action> Actions { get; set; }
|
public virtual ICollection<Action>? Actions { get; set; }
|
||||||
|
|
||||||
public bool Singleplayer { get; set; } = false;
|
public bool Singleplayer { get; set; } = false;
|
||||||
|
|
||||||
public virtual ICollection<MultiplayerMode> MultiplayerModes { get; set; }
|
public virtual ICollection<MultiplayerMode>? MultiplayerModes { get; set; }
|
||||||
public virtual ICollection<Genre> Genres { get; set; }
|
public virtual ICollection<Genre>? Genres { get; set; }
|
||||||
public virtual ICollection<Tag>? Tags { get; set; }
|
public virtual ICollection<Tag>? Tags { get; set; }
|
||||||
public virtual ICollection<Category>? Categories { get; set; }
|
public virtual ICollection<Category>? Categories { get; set; }
|
||||||
public virtual ICollection<Company> Publishers { get; set; }
|
public virtual ICollection<Company>? Publishers { get; set; }
|
||||||
public virtual ICollection<Company> Developers { get; set; }
|
public virtual ICollection<Company>? Developers { get; set; }
|
||||||
public virtual ICollection<Archive>? Archives { get; set; }
|
public virtual ICollection<Archive>? Archives { get; set; }
|
||||||
|
|
||||||
public string? ValidKeyRegex { get; set; }
|
public string? ValidKeyRegex { get; set; }
|
||||||
|
|
|
@ -29,7 +29,7 @@ namespace LANCommander.Migrations
|
||||||
|
|
||||||
b.HasIndex("GamesId");
|
b.HasIndex("GamesId");
|
||||||
|
|
||||||
b.ToTable("CategoryGame");
|
b.ToTable("CategoryGame", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("GameDeveloper", b =>
|
modelBuilder.Entity("GameDeveloper", b =>
|
||||||
|
@ -44,7 +44,7 @@ namespace LANCommander.Migrations
|
||||||
|
|
||||||
b.HasIndex("GameId");
|
b.HasIndex("GameId");
|
||||||
|
|
||||||
b.ToTable("GameDeveloper");
|
b.ToTable("GameDeveloper", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("GameGenre", b =>
|
modelBuilder.Entity("GameGenre", b =>
|
||||||
|
@ -59,7 +59,7 @@ namespace LANCommander.Migrations
|
||||||
|
|
||||||
b.HasIndex("GenresId");
|
b.HasIndex("GenresId");
|
||||||
|
|
||||||
b.ToTable("GameGenre");
|
b.ToTable("GameGenre", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("GamePublisher", b =>
|
modelBuilder.Entity("GamePublisher", b =>
|
||||||
|
@ -74,7 +74,7 @@ namespace LANCommander.Migrations
|
||||||
|
|
||||||
b.HasIndex("PublisherId");
|
b.HasIndex("PublisherId");
|
||||||
|
|
||||||
b.ToTable("GamePublisher");
|
b.ToTable("GamePublisher", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("GameTag", b =>
|
modelBuilder.Entity("GameTag", b =>
|
||||||
|
@ -89,7 +89,7 @@ namespace LANCommander.Migrations
|
||||||
|
|
||||||
b.HasIndex("TagsId");
|
b.HasIndex("TagsId");
|
||||||
|
|
||||||
b.ToTable("GameTag");
|
b.ToTable("GameTag", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("LANCommander.Data.Models.Action", b =>
|
modelBuilder.Entity("LANCommander.Data.Models.Action", b =>
|
||||||
|
@ -140,7 +140,7 @@ namespace LANCommander.Migrations
|
||||||
|
|
||||||
b.HasIndex("UpdatedById");
|
b.HasIndex("UpdatedById");
|
||||||
|
|
||||||
b.ToTable("Actions");
|
b.ToTable("Actions", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("LANCommander.Data.Models.Archive", b =>
|
modelBuilder.Entity("LANCommander.Data.Models.Archive", b =>
|
||||||
|
@ -194,7 +194,7 @@ namespace LANCommander.Migrations
|
||||||
|
|
||||||
b.HasIndex("UpdatedById");
|
b.HasIndex("UpdatedById");
|
||||||
|
|
||||||
b.ToTable("Archive");
|
b.ToTable("Archive", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("LANCommander.Data.Models.Category", b =>
|
modelBuilder.Entity("LANCommander.Data.Models.Category", b =>
|
||||||
|
@ -230,7 +230,7 @@ namespace LANCommander.Migrations
|
||||||
|
|
||||||
b.HasIndex("UpdatedById");
|
b.HasIndex("UpdatedById");
|
||||||
|
|
||||||
b.ToTable("Categories");
|
b.ToTable("Categories", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("LANCommander.Data.Models.Company", b =>
|
modelBuilder.Entity("LANCommander.Data.Models.Company", b =>
|
||||||
|
@ -261,7 +261,7 @@ namespace LANCommander.Migrations
|
||||||
|
|
||||||
b.HasIndex("UpdatedById");
|
b.HasIndex("UpdatedById");
|
||||||
|
|
||||||
b.ToTable("Companies");
|
b.ToTable("Companies", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("LANCommander.Data.Models.Game", b =>
|
modelBuilder.Entity("LANCommander.Data.Models.Game", b =>
|
||||||
|
@ -313,7 +313,7 @@ namespace LANCommander.Migrations
|
||||||
|
|
||||||
b.HasIndex("UpdatedById");
|
b.HasIndex("UpdatedById");
|
||||||
|
|
||||||
b.ToTable("Games");
|
b.ToTable("Games", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("LANCommander.Data.Models.Genre", b =>
|
modelBuilder.Entity("LANCommander.Data.Models.Genre", b =>
|
||||||
|
@ -344,7 +344,7 @@ namespace LANCommander.Migrations
|
||||||
|
|
||||||
b.HasIndex("UpdatedById");
|
b.HasIndex("UpdatedById");
|
||||||
|
|
||||||
b.ToTable("Genres");
|
b.ToTable("Genres", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("LANCommander.Data.Models.Key", b =>
|
modelBuilder.Entity("LANCommander.Data.Models.Key", b =>
|
||||||
|
@ -404,7 +404,7 @@ namespace LANCommander.Migrations
|
||||||
|
|
||||||
b.HasIndex("UpdatedById");
|
b.HasIndex("UpdatedById");
|
||||||
|
|
||||||
b.ToTable("Keys");
|
b.ToTable("Keys", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("LANCommander.Data.Models.MultiplayerMode", b =>
|
modelBuilder.Entity("LANCommander.Data.Models.MultiplayerMode", b =>
|
||||||
|
@ -455,7 +455,7 @@ namespace LANCommander.Migrations
|
||||||
|
|
||||||
b.HasIndex("UpdatedById");
|
b.HasIndex("UpdatedById");
|
||||||
|
|
||||||
b.ToTable("MultiplayerModes");
|
b.ToTable("MultiplayerModes", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("LANCommander.Data.Models.Role", b =>
|
modelBuilder.Entity("LANCommander.Data.Models.Role", b =>
|
||||||
|
@ -513,7 +513,7 @@ namespace LANCommander.Migrations
|
||||||
|
|
||||||
b.HasIndex("UpdatedById");
|
b.HasIndex("UpdatedById");
|
||||||
|
|
||||||
b.ToTable("Tags");
|
b.ToTable("Tags", (string)null);
|
||||||
});
|
});
|
||||||
|
|
||||||
modelBuilder.Entity("LANCommander.Data.Models.User", b =>
|
modelBuilder.Entity("LANCommander.Data.Models.User", b =>
|
||||||
|
|
|
@ -7,10 +7,15 @@ namespace LANCommander.Models
|
||||||
{
|
{
|
||||||
public long? IgdbId { get; set; }
|
public long? IgdbId { get; set; }
|
||||||
public Game Game { get; set; }
|
public Game Game { get; set; }
|
||||||
public List<SelectListItem> Genres { get; set; }
|
public List<SelectListItem>? Genres { get; set; }
|
||||||
public List<SelectListItem> Tags { get; set; }
|
public List<SelectListItem>? Tags { get; set; }
|
||||||
public List<SelectListItem> Categories { get; set; }
|
public List<SelectListItem>? Categories { get; set; }
|
||||||
public List<SelectListItem> Developers { get; set; }
|
public List<SelectListItem>? Developers { get; set; }
|
||||||
public List<SelectListItem> Publishers { get; set; }
|
public List<SelectListItem>? Publishers { get; set; }
|
||||||
|
public string[]? SelectedGenres { get; set; }
|
||||||
|
public string[]? SelectedTags { get; set; }
|
||||||
|
public string[]? SelectedCategories { get; set; }
|
||||||
|
public string[]? SelectedDevelopers { get; set; }
|
||||||
|
public string[]? SelectedPublishers { get; set; }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -51,6 +51,33 @@ namespace LANCommander.Services
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// <summary>
|
||||||
|
/// Adds an entity to the database if it does exist as dictated by the predicate
|
||||||
|
/// </summary>
|
||||||
|
/// <param name="predicate">Qualifier expressoin</param>
|
||||||
|
/// <param name="entity">Entity to add</param>
|
||||||
|
/// <returns>Newly created or existing entity</returns>
|
||||||
|
public virtual async Task<T> AddMissing(Expression<Func<T, bool>> predicate, T entity)
|
||||||
|
{
|
||||||
|
using (var repo = new Repository<T>(Context, HttpContext))
|
||||||
|
{
|
||||||
|
var existing = repo.Get(predicate).FirstOrDefault();
|
||||||
|
|
||||||
|
if (existing == null)
|
||||||
|
{
|
||||||
|
entity = await repo.Add(entity);
|
||||||
|
|
||||||
|
await repo.SaveChanges();
|
||||||
|
|
||||||
|
return entity;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return existing;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public virtual async Task<T> Update(T entity)
|
public virtual async Task<T> Update(T entity)
|
||||||
{
|
{
|
||||||
using (var repo = new Repository<T>(Context, HttpContext))
|
using (var repo = new Repository<T>(Context, HttpContext))
|
||||||
|
|
|
@ -53,24 +53,24 @@
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label asp-for="Developers" class="control-label"></label>
|
<label asp-for="Developers" class="control-label"></label>
|
||||||
<input type="text" class="developer-select" />
|
<input type="text" class="developer-select" />
|
||||||
<select asp-for="Developers" asp-items="Model.Developers" class="d-none"></select>
|
<select asp-for="SelectedDevelopers" class="d-none"></select>
|
||||||
</div>
|
</div>
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label asp-for="Publishers" class="control-label"></label>
|
<label asp-for="Publishers" class="control-label"></label>
|
||||||
<input type="text" class="publisher-select" />
|
<input type="text" class="publisher-select" />
|
||||||
<select asp-for="Publishers" asp-items="Model.Publishers" class="d-none"></select>
|
<select asp-for="SelectedPublishers" class="d-none"></select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label asp-for="Genres" class="control-label"></label>
|
<label asp-for="Genres" class="control-label"></label>
|
||||||
<input type="text" class="genre-select" />
|
<input type="text" class="genre-select" />
|
||||||
<select asp-for="Genres" asp-items="Model.Genres" class="d-none"></select>
|
<select asp-for="SelectedGenres" class="d-none"></select>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<div class="mb-3">
|
<div class="mb-3">
|
||||||
<label asp-for="Tags" class="control-label"></label>
|
<label asp-for="Tags" class="control-label"></label>
|
||||||
<input type="text" class="tag-select" />
|
<input type="text" class="tag-select" />
|
||||||
<select asp-for="Tags" asp-items="Model.Tags" class="d-none"></select>
|
<select asp-for="SelectedTags" class="d-none"></select>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
Loading…
Add table
Reference in a new issue