using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using eprintServer.Services; using eprintServer.Responses; using eprintServer.Entities; using eprintServer.Requests; using eprintServer.Enums; namespace eprintServer.Controllers; [ApiController] [Route("api/[controller]")] [Authorize(Roles = "ADMIN,SUB_ADMIN")] public class SubAdminController : ControllerBase { private readonly UserService _userService; private readonly SubAdminService _subAdminService; public SubAdminController(UserService userService, SubAdminService subAdminService) { _userService = userService; _subAdminService = subAdminService; } [HttpGet("get-subadmin-privileges")] public ActionResult> GetSubAdminPrivileges() { var privileges = _subAdminService.GetSubAdminPrivileges(); return Ok(privileges); } [HttpPost("add_sub_admin")] public async Task> AddEmployee([FromBody] SubAdminRequest request) { if (string.IsNullOrEmpty(request.Password) || string.IsNullOrEmpty(request.Email)) { return StatusCode(StatusCodes.Status406NotAcceptable, "Email and password can't be null or empty."); } if (await _userService.ExistByEmailAsync(request.Email.ToLower())) { return StatusCode(StatusCodes.Status406NotAcceptable, "Email already exists."); } if (!string.IsNullOrEmpty(request.PhoneNumber) && await _userService.ExistByPhoneNumberAsync(request.PhoneNumber)) { return StatusCode(StatusCodes.Status406NotAcceptable, "Phone number already exists."); } try { var userCount = await _userService.GetUserCountAsync(); var Username = _userService.GenerateUsername(request.Name, userCount); var newUser = new User { Name = request.Name, Email = request.Email, Username = Username, PhoneNumber = request.PhoneNumber, City = request.City, Country = request.Country, OfficeRole = request.OfficeRole, Password = request.Password, Active = true, SubAdminsPrivilegesList = request.Privileges }; var result = await _userService.SaveSubAdminAsync(newUser); return Ok(result); } catch (Exception e) { return StatusCode(StatusCodes.Status500InternalServerError, $"An error occurred while saving: {e.Message}"); } } [HttpPut("update_sub_admin_privileges/{userId}")] public async Task> UpdateSubAdminPrivileges( long userId, [FromBody] UpdateSubAdminPrivilegesRequest request) { if (userId <= 0) { return BadRequest("A valid user ID is required in the path."); } try { var updatedUser = await _userService.UpdateSubAdminPrivilegesAsync(userId, request.Privileges); if (updatedUser == null) { return NotFound($"User with ID {userId} not found."); } return Ok(updatedUser); } catch (Exception e) { return StatusCode(StatusCodes.Status500InternalServerError, $"An error occurred while updating privileges: {e.Message}"); } } [HttpGet("get_sub_admins")] public async Task>> GetSubAdmins( [FromQuery] int page = 0, [FromQuery] int size = 5, [FromQuery] string? search = null) { try { var pagedResult = await _userService.GetPagedUsersByCriteriaAsync( page: page, size: size, role: RoleEnum.ROLE_SUB_ADMIN, search ); return Ok(pagedResult); } catch (Exception e) { return StatusCode(StatusCodes.Status500InternalServerError, $"An error occurred while fetching sub-admins: {e.Message}"); } } }