public async Task <IActionResult> Contacts(string tag) { if (tag == null) { return(BadRequest()); } var uid = UserId(); var gid = GameId(); var character = await _context.Characters .Include(p => p.Contacts) .ThenInclude(p => p.Reflection) .FirstOrDefaultAsync(p => p.UserId == uid); var target = await _context.Characters.FirstOrDefaultAsync(p => p.Tag == tag && p.GameId == gid); if (target == null) { return(RedirectToAction("NoContact")); } var contact = new CharacterReflection() { Owner = character, Reflection = target }; character.Contacts.Add(contact); target.Watchers.Add(contact); await _context.SaveChangesAsync(); return(View(character.Contacts.Select(p => new ContactView(p.Reflection)))); }
public async Task <ActionResult> EditContacts(long id, long[] ids) { var gid = GameId(); var character = await _context.Characters .Include(p => p.Contacts) .FirstOrDefaultAsync(p => p.Id == id && p.GameId == (Guid)gid); if (character == null) { return(NotFound()); } var characters = await _context.Characters .Include(p => p.Watchers) .Where(p => p.GameId == gid) .ToListAsync(); var blackList = character.Contacts.Where(p => !ids.Contains((long)p.ReflectionId)); foreach (var b in blackList) { character.Contacts.Remove(b); } var whiteList = characters.Where(p => ids.Contains(p.Id) && !character.Contacts.Select(c => c.ReflectionId).Contains(p.Id)); foreach (var t in whiteList) { var contact = new CharacterReflection() { Owner = character, Reflection = t }; character.Contacts.Add(contact); t.Watchers.Add(contact); } try { await _context.SaveChangesAsync(); return(RedirectToAction(nameof(Index), new { id })); } catch { ViewBag.characters = characters .Select(p => new Selectable(p.Id.ToString(), p.Name)) .ToList(); return(View(new ContactList(character))); } }