using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using Microsoft.AspNetCore.Mvc; using Microsoft.EntityFrameworkCore; using StudyLib.API.Data; using StudyLib.API.Models; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks; namespace StudyLib.API.Controllers { [Route("api/groupCandidates")] [Authorize] [ApiController] public class GroupCandidatesController : ControllerBase { private readonly StudyLibContext _context; public GroupCandidatesController(StudyLibContext context) { _context = context; } [HttpGet("list/{groupId}")] public async Task>> GetGroupCandidates(long groupId) { return await _context.GroupCandidates.Where(g => g.Group.ID == groupId).Include(g => g.User).Select(g => g.User).ToListAsync(); } [HttpPost("join-request")] public async Task GroupCandidate(GroupCandidateSaveModel groupCandidateSaveModel) { var user = await _context.Users.FindAsync(groupCandidateSaveModel.UserId); var group = await _context.Groups.FindAsync(groupCandidateSaveModel.GroupId); var groupCandidate = new GroupCandidate { GroupId = groupCandidateSaveModel.GroupId, Group = group, UserId = groupCandidateSaveModel.UserId, User = user }; _context.GroupCandidates.Add(groupCandidate); await _context.SaveChangesAsync(); return NoContent(); } [HttpGet("accept/{groupId}/{userId}")] public async Task AcceptGroupCandidate(long groupId, string userId) { var groupCandidate = await _context.GroupCandidates.Where(g => g.Group.ID == groupId && g.User.Id == userId).FirstAsync(); if (groupCandidate == null) { return NotFound(); } _context.GroupCandidates.Remove(groupCandidate); var user = await _context.Users.FindAsync(userId); var group = await _context.Groups.Where(g => g.ID == groupId).Include(g => g.Users).FirstAsync(); if (!group.Users.Contains(user)) { group.Users.Add(user); _context.Entry(group).State = EntityState.Modified; } await _context.SaveChangesAsync(); return NoContent(); } [HttpDelete("decline/{groupId}/{userId}")] public async Task DeclineGroupCandidate(long groupId, string userId) { var groupCandidate = await _context.GroupCandidates.Where(g => g.Group.ID == groupId && g.User.Id == userId).FirstAsync(); if (groupCandidate == null) { return NotFound(); } _context.GroupCandidates.Remove(groupCandidate); await _context.SaveChangesAsync(); return NoContent(); } private bool GroupCandidateExists(long groupId, string userId) { return _context.GroupCandidates.Any(g => g.Group.ID == groupId && g.User.Id == userId); } } }