public static async Task<IList<Group>> LoadRandom( SocialGamificationAssetContext db, Group group, IList<CustomDataBase> customData, bool alliancesOnly = false, int limit = 1) { IQueryable<Group> query = db.Groups; if (alliancesOnly) { var alliancesList = Alliance.GetAllianceIds(db, group.Id, AllianceState.Accepted); query = query.Where(a => alliancesList.Contains(group.Id)); } else { query = query.Where(g => g.Id != group.Id).Where(g => g.Type == GroupVisibility.Public); } // CustomData conditions var cQuery = Models.CustomData.ConditionBuilder(db, customData, CustomDataType.Group); IList<Guid> similarGroups = await cQuery.Select(c => c.ObjectId).Distinct().ToListAsync(); // Check if Group satisfy CustomData constraints IList<Group> groups = await query.Where(g => similarGroups.Contains(g.Id)).ToListAsync(); return GenericHelper.Shuffle(groups, limit); }
public async Task<IActionResult> CreateGroup([FromBody] GroupFrom form) { if (!ModelState.IsValid) { return HttpResponseHelper.BadRequest(ModelState); } if (string.IsNullOrWhiteSpace(form.Name)) { return HttpResponseHelper.BadRequest("Group name is required."); } if (await Group.ExistsUsername(_context, form.Name)) { return HttpResponseHelper.BadRequest("Group with this name already exists."); } var group = new Group { Username = form.Name, Type = form.Type, AdminId = session.Player.Id }; if (form.Players == null || form.Players.Count < 1) { return HttpResponseHelper.BadRequest("Group requires minimum 1 Player."); } IList<Player> players = new List<Player>(); foreach (var playerId in form.Players) { var player = await _context.Players.FindAsync(playerId); if (player == null) { return HttpResponseHelper.NotFound($"No Player with Id {playerId} exists."); } players.Add(player); } group.Players = players; _context.Groups.Add(group); var error = await SaveChangesAsync(); if (error != null) { return error; } return CreatedAtRoute("GetGroupInfo", new { id = group.Id }, group); }