using System.Web.Http; using static Step.Utils.Constants; using Step.Database.Controllers; using System; using Step.Model.DatabaseModels; using System.Security.Claims; using System.Linq; using static Step.Utils.LanguageController; using Step.Model.DTOModels; using System.Globalization; using Microsoft.AspNet.SignalR; using Step.Controllers.SignalR; namespace Step.Controllers.WebApi { [RoutePrefix("api/user")] public class UserController : ApiController { [Route("logout"), HttpPost] [WebApiAuthorize(FunctionAccess = "logout", Action = ACTIONS.WRITE)] public IHttpActionResult Logout() { var identity = User.Identity as ClaimsIdentity; // Find user id from the bearer token var userId = identity.Claims.Where(c => c.Type == USER_ID_KEY).SingleOrDefault(); if (userId == null) return Unauthorized(); // Find machine id from the bearer token var machineId = identity.Claims.Where(c => c.Type == MACHINE_ID_KEY).SingleOrDefault(); if (machineId == null) return Unauthorized(); using (SessionsController sessionsController = new SessionsController()) { // Delete all the user session on the machine sessionsController.DeleteSessionsByUserAndMachineId(Convert.ToInt32(machineId.Value), Convert.ToInt32(userId.Value)); } // Send to the clients the id of the disconnected user var context = GlobalHost.ConnectionManager.GetHubContext(); context.Clients.All.logout(new { id = userId.Value }); return Ok(); } [Route("register"), HttpPost] public IHttpActionResult CreateUser(UserModel model) { UsersController users = new UsersController(); users.Create(model.Username, model.Password, model.FirstName, model.LastName, model.Language); return Ok(); } [Route("info"), HttpGet] [WebApiAuthorize(FunctionAccess = "userData", Action = ACTIONS.READ)] public IHttpActionResult UserInfo() { var identity = User.Identity as ClaimsIdentity; // Find user id from the bearer token var userId = identity.Claims.Where(c => c.Type == USER_ID_KEY).SingleOrDefault(); if (userId == null) return Unauthorized(); using (UsersController usersController = new UsersController()) { return Ok(usersController.GetUserInfo(Convert.ToInt32(userId.Value))); } } [Route("language"), HttpPut] [WebApiAuthorize(FunctionAccess = "userData", Action = ACTIONS.READ)] public IHttpActionResult PutUserLanguage([FromBody] dynamic user) { // If no body return 400 if (user == null) return BadRequest(); // Validate user id var identity = User.Identity as ClaimsIdentity; var userId = identity.Claims.Where(c => c.Type == USER_ID_KEY).SingleOrDefault(); if (userId == null) return Unauthorized(); // Parse body data and validate language var newLanguage = (string)user.language; if (newLanguage == null || !IsValidLanguage(newLanguage)) return BadRequest(); // Find if language is Available in the server directory if (!LanguageIsAvailable(newLanguage)) return NotFound(); using (UsersController usersController = new UsersController()) { // Update database with new language usersController.ChangeUserLanguage(Convert.ToInt32(userId.Value), CultureInfo.CreateSpecificCulture(newLanguage)); return Ok(); } } } }