using System.Collections.Generic; using System.Security.Claims; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Mvc; using OnlineAssessment.Common; using OnlineAssessment.Data.EFCore; using OnlineAssessment.Domain.Models; using OnlineAssessment.Domain.ViewModels; namespace OnlineAssessment.V1.Controllers { [ApiController] [ApiVersion("1.0")] [Route("v{version:apiVersion}")] public class InstitutesController : BaseController { EFCoreInstituteRepository _repository; string responseMessage = string.Empty; public InstitutesController(EFCoreInstituteRepository repository) : base(repository) { _repository = repository; } #region Institute /// /// Get the detail of a institute /// /// /// [HttpGet("{id}")] [Authorize(Roles = "SuperAdmin,Admin")] public IActionResult Get(int id) { IActionResult returnResponse; if (id != base.InstituteId) { responseMessage = _repository.GetMessageByCode(Message.NotAllowedToResource.ToString()); returnResponse = Unauthorized(ReturnResponse.GetFailureStatus(responseMessage)); return returnResponse; } dynamic entity = _repository.GetInstituteById(id); if (entity == null) { responseMessage = _repository.GetMessageByCode(Message.NoData.ToString()); returnResponse = Ok(ReturnResponse.GetFailureStatus(responseMessage)); } else { returnResponse = Ok(ReturnResponse.GetSuccessStatus(entity)); } return returnResponse; } /// /// Get the theme of an institute /// /// [HttpGet("Theme")] [Authorize(Roles = "Admin,Student")] public IActionResult GetTheme() { IActionResult returnResponse; string entity = _repository.GetTheme(base.InstituteId); if (entity == null) { responseMessage = _repository.GetMessageByCode(Message.NoData.ToString()); returnResponse = Ok(ReturnResponse.GetFailureStatus(responseMessage)); } else { returnResponse = Ok(ReturnResponse.GetSuccessStatus(entity)); } return returnResponse; } /// /// Update the theme of an institute /// /// [HttpPut("Theme")] [Authorize(Roles = "Admin")] public IActionResult UpdateTheme([FromBody] string color) { IActionResult returnResponse; int user_id = Security.GetIdFromJwtToken(UserClaim.UserId, HttpContext.User.Identity as ClaimsIdentity); string entity = _repository.UpdateTheme(base.InstituteId, user_id, color); if (entity == null) { responseMessage = _repository.GetMessageByCode(Message.NoData.ToString()); returnResponse = Ok(ReturnResponse.GetFailureStatus(responseMessage)); } else { returnResponse = Ok(ReturnResponse.GetSuccessStatus(entity)); } return returnResponse; } #endregion #region Classes /// /// Get class structure /// /// /// [HttpGet("Classes/{id}/Structure")] [Authorize(Roles = "Admin")] public IActionResult GetClassesStructure(int id) { IActionResult returnResponse; ClassStructureViewModel structure = null; //------------------------------------------------------------------------------------- structure = _repository.GetClassStructurebyId(base.InstituteId, id); //------------------------------------------------------------------------------------- if (structure == null) { responseMessage = _repository.GetMessageByCode(Message.NoData.ToString()); returnResponse = Ok(ReturnResponse.GetFailureStatus(responseMessage)); } else { returnResponse = Ok(ReturnResponse.GetSuccessStatus(structure)); } return returnResponse; } /// /// Get list of active classes (for the user's institution) /// /// /// /// [HttpGet("Classes")] [Authorize(Roles = "Admin")] public IActionResult GetClassesOfTheInstitution([FromQuery] string sortBy, string sortOrder) { IActionResult returnResponse; int role_id = int.Parse(Security.GetValueFromToken("RoleId", HttpContext.User.Identity as ClaimsIdentity)); //------------------------------------------------------------------------------------- List classList = _repository.GetClassesOfTheInstitution(base.InstituteId, sortBy, sortOrder); //------------------------------------------------------------------------------------- if (classList == null || classList.Count.Equals(0)) { responseMessage = _repository.GetMessageByCode(Message.NoData.ToString()); returnResponse = Ok(ReturnResponse.GetFailureStatus(responseMessage)); } else { returnResponse = Ok(ReturnResponse.GetSuccessStatus(classList)); } return returnResponse; } /// /// Get detail of a specific class of the Institution /// /// /// [HttpGet("Classes/{class_id}")] [Authorize(Roles = "Admin")] public IActionResult GetClassById(int class_id) { IActionResult returnResponse; ClassViewModel classvm = null; //------------------------------------------------------------------------------------- classvm = _repository.GetClassById(base.InstituteId, class_id); //------------------------------------------------------------------------------------- if (classvm == null) { responseMessage = _repository.GetMessageByCode(Message.NoData.ToString()); returnResponse = Ok(ReturnResponse.GetFailureStatus(responseMessage)); } else { returnResponse = Ok(ReturnResponse.GetSuccessStatus(classvm)); } return returnResponse; } /// /// Add a new class of the Institution /// /// /// /// [HttpPost("Classes")] [Authorize(Roles = "Admin")] public IActionResult AddClassToTheInstitute([FromBody] ClassAddModel newClass) { IActionResult returnResponse = null; int user_id = Security.GetIdFromJwtToken(UserClaim.UserId, HttpContext.User.Identity as ClaimsIdentity); if (newClass == null || newClass.name == null) { responseMessage = _repository.GetMessageByCode(Message.FailedToAdd.ToString(), Constant.Class); return returnResponse; } // Add new class ClassViewModel cv = _repository.AddNewClassOfTheInstitution(base.InstituteId, user_id, newClass.name); if (cv == null) { responseMessage = _repository.GetMessageByCode(Message.ObjectNotAdded.ToString(), Constant.Class); returnResponse = Ok(ReturnResponse.GetFailureStatus(responseMessage)); } else { returnResponse = Ok(ReturnResponse.GetSuccessStatus(cv)); } return returnResponse; } /// /// Update the class of an institute /// /// /// /// [HttpPut("Classes/{class_id}")] [Authorize(Roles = "Admin")] public IActionResult UpdateClassOfTheInstitute(int class_id, [FromBody] ClassEditModel theClass) { IActionResult returnResponse = null; int user_id = Security.GetIdFromJwtToken(UserClaim.UserId, HttpContext.User.Identity as ClaimsIdentity); if (theClass == null || theClass.name == null) { responseMessage = _repository.GetMessageByCode(Message.FailedToUpdate.ToString(), Constant.Class); return returnResponse; } ClassViewModel cv = _repository.UpdateClassOfTheInstitution(base.InstituteId, user_id, class_id, theClass.name); if (cv == null) { responseMessage = _repository.GetMessageByCode(Message.ObjectNotUpdated.ToString(), Constant.Class); returnResponse = Ok(ReturnResponse.GetFailureStatus(responseMessage)); } else { returnResponse = Ok(ReturnResponse.GetSuccessStatus(cv)); } return returnResponse; } /// /// Delete the class of an institute /// /// /// [HttpDelete("Classes/{class_id}")] [Authorize(Roles = "Admin")] public IActionResult DeleteClassOfTheInstitute(int class_id) { IActionResult returnResponse = null; int user_id = Security.GetIdFromJwtToken(UserClaim.UserId, HttpContext.User.Identity as ClaimsIdentity); int returnResult = _repository.DeleteClassOfTheInstitution(base.InstituteId, user_id, class_id); if (returnResult <= 0) { if (returnResult.Equals((int)Message.NotAllowedToResource)) { returnResponse = Unauthorized(ReturnResponse.GetFailureStatus(base.NotAllowedMessages(UserOperation.Delete))); } else { responseMessage = _repository.GetMessageByCode(Message.ObjectNotDeleted.ToString(), Constant.Institute); returnResponse = Ok(ReturnResponse.GetFailureStatus(responseMessage)); } } else { responseMessage = _repository.GetMessageByCode(Message.ObjectDeleteSuccessfully.ToString(), Constant.Institute); returnResponse = Ok(ReturnResponse.GetSuccessStatus(responseMessage)); } return returnResponse; } #endregion #region Subjects /// /// Get subjects of a given class of the institution /// /// /// /// /// /// [HttpGet("Classes/{class_id}/Subjects")] [Authorize(Roles = "Admin")] public IActionResult GetAllSubjectsOfTheClass(int class_id, [FromQuery] int subject_id, [FromQuery] string sortBy, string sortOrder) { IActionResult returnResponse; //------------------------------------------------------------------------------------- List theList = _repository.GetSubjectsOfTheClass(base.InstituteId, class_id, subject_id, sortBy, sortOrder); //------------------------------------------------------------------------------------- if (theList == null || theList.Count.Equals(0)) { responseMessage = _repository.GetMessageByCode(Message.NoData.ToString()); returnResponse = Ok(ReturnResponse.GetFailureStatus(responseMessage)); } else { returnResponse = Ok(ReturnResponse.GetSuccessStatus(theList)); } return returnResponse; } /// /// Add a new subject of a class /// /// /// /// [HttpPost("Classes/{class_id}/Subjects")] [Authorize(Roles = "Admin")] public IActionResult AddSubjectOfTheClass(int class_id, [FromBody] SubjectAddModel newSubject) { IActionResult returnResponse = null; int user_id = Security.GetIdFromJwtToken(UserClaim.UserId, HttpContext.User.Identity as ClaimsIdentity); string returnMessage = string.Empty; ClassViewModel c = _repository.GetClassById(base.InstituteId, class_id); if (c == null || c.isActive == false) // This class not belong to the request sender's institute { returnResponse = Unauthorized(ReturnResponse.GetFailureStatus(base.NotAllowedMessages(UserOperation.Add))); return returnResponse; } //------------------------------------------------------------------------------------- SubjectViewModel subject = _repository.AddSubjectOfTheClass(base.InstituteId, c.id, user_id, newSubject); //------------------------------------------------------------------------------------- if (subject == null) { responseMessage = _repository.GetMessageByCode(Message.ObjectNotAdded.ToString(), Constant.Subject); returnResponse = Ok(ReturnResponse.GetFailureStatus(new List { responseMessage, returnMessage })); } else { returnResponse = Ok(ReturnResponse.GetSuccessStatus(subject)); } return returnResponse; } /// /// Update subject /// /// /// /// [HttpPut("Subjects/{subject_id}")] [Authorize(Roles = "Admin")] public IActionResult UpdateSubjectOfTheInstitute(int subject_id, [FromBody] SubjectEditModel theSubject) { IActionResult returnResponse = null; int user_id = Security.GetIdFromJwtToken(UserClaim.UserId, HttpContext.User.Identity as ClaimsIdentity); if (theSubject == null || theSubject.name == null) { responseMessage = _repository.GetMessageByCode(Message.FailedToAdd.ToString(), Constant.Subject); return returnResponse; } //------------------------------------------------------------------------------------- SubjectViewModel subject = _repository.UpdateSubjectOfTheInstitution(base.InstituteId, user_id, subject_id, theSubject.name); //------------------------------------------------------------------------------------- if (subject == null) { responseMessage = _repository.GetMessageByCode(Message.ObjectNotUpdated.ToString(), Constant.Subject); returnResponse = Ok(ReturnResponse.GetFailureStatus(responseMessage)); } else { returnResponse = Ok(ReturnResponse.GetSuccessStatus(subject)); } return returnResponse; } /// /// Delete Subject /// /// /// [HttpDelete("Subjects/{subject_id}")] [Authorize(Roles = "Admin")] public IActionResult DeleteSubjectOfTheClass(int subject_id) { IActionResult returnResponse = null; int user_id = Security.GetIdFromJwtToken(UserClaim.UserId, HttpContext.User.Identity as ClaimsIdentity); //------------------------------------------------------------------------------------- int returnResult = _repository.DeleteSubjectById(base.InstituteId, user_id, subject_id); //------------------------------------------------------------------------------------- if (returnResult <= 0) { if (returnResult.Equals((int)Message.NotAllowedToResource)) { returnResponse = Unauthorized(ReturnResponse.GetFailureStatus(base.NotAllowedMessages(UserOperation.Delete))); } else { responseMessage = _repository.GetMessageByCode(Message.ObjectNotDeleted.ToString(), Constant.Subject); returnResponse = Ok(ReturnResponse.GetFailureStatus(responseMessage)); } } else { responseMessage = _repository.GetMessageByCode(Message.ObjectDeleteSuccessfully.ToString(), Constant.Subject); returnResponse = Ok(ReturnResponse.GetSuccessStatus(responseMessage)); } return returnResponse; } #endregion #region Categories /// /// Get active categories of a active subject /// /// /// /// /// /// [HttpGet("Subjects/{subject_id}/Categories")] [Authorize(Roles = "Admin")] public IActionResult GetCategoriesOfTheSubject(int subject_id, [FromQuery] int category_id, [FromQuery] string sortBy, string sortOrder) { IActionResult returnResponse; //------------------------------------------------------------------------------------- List theList = _repository.GetCategoriesOfTheSubject(base.InstituteId, subject_id, category_id, sortBy, sortOrder); //------------------------------------------------------------------------------------- if (theList == null || theList.Count.Equals(0)) { responseMessage = _repository.GetMessageByCode(Message.NoData.ToString()); returnResponse = Ok(ReturnResponse.GetFailureStatus(responseMessage)); } else { returnResponse = Ok(ReturnResponse.GetSuccessStatus(theList)); } return returnResponse; } /// /// Create new category /// /// /// /// [HttpPost("Subjects/{subject_id}/Categories")] [Authorize(Roles = "Admin")] public IActionResult AddCategoryOfTheSubject(int subject_id, [FromBody] CategoryAddModel newCategory) { IActionResult returnResponse = null; int user_id = Security.GetIdFromJwtToken(UserClaim.UserId, HttpContext.User.Identity as ClaimsIdentity); if (newCategory == null || newCategory.name == null) { responseMessage = _repository.GetMessageByCode(Message.FailedToAdd.ToString(), Constant.Category); return returnResponse; } CategoryViewModel category = _repository.AddCategoryOfTheSubject(base.InstituteId, subject_id, user_id, newCategory); if (category == null) { responseMessage = _repository.GetMessageByCode(Message.ObjectNotAdded.ToString(), Constant.Category); returnResponse = Ok(ReturnResponse.GetFailureStatus(responseMessage)); } else { returnResponse = Ok(ReturnResponse.GetSuccessStatus(category)); } return returnResponse; } /// /// Update Category (Logic) - category id should be from same institute, category should be active /// /// /// /// [HttpPut("Categories/{category_id}")] [Authorize(Roles = "Admin")] public IActionResult UpdateCategoryByID(int category_id, [FromBody] CategoryEditModel theCategory) { IActionResult returnResponse = null; int user_id = Security.GetIdFromJwtToken(UserClaim.UserId, HttpContext.User.Identity as ClaimsIdentity); if (theCategory == null || theCategory.name == null) { responseMessage = _repository.GetMessageByCode(Message.FailedToAdd.ToString(), Constant.Category); return returnResponse; } CategoryViewModel category = _repository.UpdateCategoryByID(base.InstituteId, category_id, user_id, theCategory.name); if (category == null) { responseMessage = _repository.GetMessageByCode(Message.ObjectNotUpdated.ToString(), Constant.Category); returnResponse = Ok(ReturnResponse.GetFailureStatus(responseMessage)); } else { returnResponse = Ok(ReturnResponse.GetSuccessStatus(category)); } return returnResponse; } /// /// Delete Category (Logic) - category id should be from same institute, category should be active /// /// [HttpDelete("Categories/{category_id}")] [Authorize(Roles = "Admin")] public IActionResult DeleteCategoryByID(int category_id) { IActionResult returnResponse = null; int user_id = Security.GetIdFromJwtToken(UserClaim.UserId, HttpContext.User.Identity as ClaimsIdentity); //------------------------------------------------------------------------------------- int returnResult = _repository.DeleteCategoryByID(base.InstituteId, user_id, category_id); //------------------------------------------------------------------------------------- if (returnResult <= 0) { if (returnResult.Equals((int)Message.NotAllowedToResource)) { returnResponse = Unauthorized(ReturnResponse.GetFailureStatus(base.NotAllowedMessages(UserOperation.Delete))); } else { responseMessage = _repository.GetMessageByCode(Message.ObjectNotDeleted.ToString(), Constant.Category); returnResponse = Ok(ReturnResponse.GetFailureStatus(responseMessage)); } } else { responseMessage = _repository.GetMessageByCode(Message.ObjectDeleteSuccessfully.ToString(), Constant.Category); returnResponse = Ok(ReturnResponse.GetSuccessStatus(responseMessage)); } return returnResponse; } #endregion #region Tags /// /// Get all tags /// /// /// /// [HttpGet("Tags")] [Authorize(Roles = "Admin")] public IActionResult GetAllTagsOfTheInstitution([FromQuery] string sortBy, string sortOrder) { IActionResult returnResponse; List theList = _repository.GetTagsOfTheInstitute(base.InstituteId, sortBy, sortOrder); if (theList == null || theList.Count.Equals(0)) { responseMessage = _repository.GetMessageByCode(Message.NoData.ToString()); returnResponse = Ok(ReturnResponse.GetFailureStatus(responseMessage)); } else { returnResponse = Ok(ReturnResponse.GetSuccessStatus(theList)); } return returnResponse; } /// /// Add new tag /// /// /// [HttpPost("Tags")] [Authorize(Roles = "Admin")] public IActionResult AddTagOfClassOfTheInstitute([FromBody] TagAddModel newTag) { IActionResult returnResponse = null; int user_id = Security.GetIdFromJwtToken(UserClaim.UserId, HttpContext.User.Identity as ClaimsIdentity); TagViewModel tag = _repository.AddTagOfTheInstitute(base.InstituteId, user_id, newTag); if (tag == null) { responseMessage = _repository.GetMessageByCode(Message.ObjectNotAdded.ToString(), Constant.Institute); returnResponse = Ok(ReturnResponse.GetFailureStatus(responseMessage)); } else { returnResponse = Ok(ReturnResponse.GetSuccessStatus(tag)); } return returnResponse; } /// /// Edit a tag /// /// /// /// [HttpPut("Tags/{tag_id}")] [Authorize(Roles = "Admin")] public IActionResult UpdateTagOfTheInstitute(int tag_id, [FromBody] TagEditModel tag) { IActionResult returnResponse = null; int user_id = Security.GetIdFromJwtToken(UserClaim.UserId, HttpContext.User.Identity as ClaimsIdentity); if (tag_id != tag.Id) { responseMessage = _repository.GetMessageByCode(Message.IdMismatchBetweenBodyAndQueryString.ToString()); returnResponse = Ok(ReturnResponse.GetFailureStatus(responseMessage)); return returnResponse; } TagViewModel theTag = _repository.UpdateTagOfTheInstitute(base.InstituteId, user_id, tag); if (theTag == null) { responseMessage = _repository.GetMessageByCode(Message.ObjectNotUpdated.ToString(), Constant.Tag); returnResponse = Ok(ReturnResponse.GetFailureStatus(responseMessage)); } else { returnResponse = Ok(ReturnResponse.GetSuccessStatus(theTag)); } return returnResponse; } /// /// Delete a tag /// /// /// [HttpDelete("Tags/{tag_id}")] [Authorize(Roles = "Admin")] public IActionResult DeleteTagOfTheInstitute(int tag_id) { IActionResult returnResponse = null; int user_id = Security.GetIdFromJwtToken(UserClaim.UserId, HttpContext.User.Identity as ClaimsIdentity); int returnResult = _repository.DeleteTagOfTheInstitute(base.InstituteId, user_id, tag_id); if (returnResult <= 0) { responseMessage = _repository.GetMessageByCode(Message.ObjectNotDeleted.ToString(), Constant.Tag); returnResponse = Ok(ReturnResponse.GetFailureStatus(responseMessage)); } else { responseMessage = _repository.GetMessageByCode(Message.ObjectDeleteSuccessfully.ToString(), Constant.Tag); returnResponse = Ok(ReturnResponse.GetSuccessStatus(responseMessage)); } return returnResponse; } #endregion #region Users /// /// Get the users of an institute /// /// /// /// /// [HttpGet("Users")] [Authorize(Roles = "Admin")] public IActionResult GetUserOfTheInstitution([FromQuery] string role, [FromQuery] string sortBy, string sortOrder, [FromQuery] int? pageNumber, [FromQuery] int? pageSize) { IActionResult returnResponse; UserViewAllPagedModel userListPaged = new UserViewAllPagedModel(); int roleId = 4; //TODO : hardcoded if (pageNumber == null) pageNumber = 1; if (pageSize == null) pageSize = 20; List userList = _repository.GetUserOfTheInstitution(base.InstituteId, roleId, sortBy, sortOrder); if (userList == null || userList.Count.Equals(0)) { responseMessage = _repository.GetMessageByCode(Message.NoData.ToString()); returnResponse = Ok(ReturnResponse.GetFailureStatus(responseMessage)); } else { if (pageNumber != null && pageSize != null) { PaginatedList pList = PaginatedList.CreateAsync(userList, (int)pageNumber, (int)pageSize); userListPaged.total_count = userList.Count; userListPaged.total_pages = pList.TotalPages; userListPaged.page_index = pList.PageIndex; userListPaged.next = pList.HasNextPage; userListPaged.previous = pList.HasPreviousPage; userListPaged.users = pList; } returnResponse = Ok(ReturnResponse.GetSuccessStatus(userListPaged)); //returnResponse = Ok(ReturnResponse.GetSuccessStatus(userList)); } return returnResponse; } #endregion } }