using Step.Database.Controllers; using Step.Model.DatabaseModels; using Step.Model.DTOModels.AlarmModels; using Step.NC; using Step.Provider; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Security.Claims; using System.Threading.Tasks; using System.Web.Http; using static Step.Model.Constants; namespace Step.Controllers.WebApi { [RoutePrefix("api/alarm")] public class ApiAlarmController : ApiController { [Route("paginated"), HttpPost] public IHttpActionResult GetDataPaginated([FromBody]DTOAlarmsFilterModel filter) { if (!ModelState.IsValid) return BadRequest(ModelState); Dictionary plcMessages = new Dictionary(); using (NcHandler ncHandler = new NcHandler()) { // Read data ncHandler.numericalControl.NC_GetTranslatedPlcMessages(filter.Language, ref plcMessages); } using (AlarmsController alarm = new AlarmsController()) { var alarms = alarm.GetPaginatedWithFilter(filter.Title, filter.Type, filter.Page - 1, filter.PageSize, filter.StartDate.Value, filter.EndDate, filter.UserIds, plcMessages); return Ok(alarms); } } [Route("data"), HttpPost] public IHttpActionResult GetAlarmsData(int pageSize) { using (AlarmsController alarmController = new AlarmsController()) { var alarms = alarmController.GetAlarmsData(pageSize); return Ok(alarms); } } #region Note [Route("{alarmDescId:int}/note"), HttpGet] [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.MAINTENANCE, Action = ACTIONS.READ)] public IHttpActionResult GetAlarmNotes(int alarmDescId) { if (!ModelState.IsValid) return BadRequest(ModelState); using (AlarmsController alarmsController = new AlarmsController()) { // Check if alarm desc exists AlarmDescriptionsModel dbAlarm = alarmsController.FindById(alarmDescId); if (dbAlarm == null) return NotFound(); // Update data List notes = alarmsController.GetNotesByAlarmDescId(alarmDescId); return Ok(notes); } } [Route("{alarmDescId:int}/note"), HttpPost] [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.USER_FUNCTIONS, Action = ACTIONS.WRITE)] public IHttpActionResult AddAlarmNote(int alarmDescId, DTONewAlarmNoteModel note) { if (!ModelState.IsValid) return BadRequest(ModelState); var identity = User.Identity as ClaimsIdentity; // Find user id from the bearer token var userId = identity.Claims.Where(c => c.Type == USER_ID_KEY).FirstOrDefault(); using (AlarmsController alarmsController = new AlarmsController()) { // Check if alarm desc exists AlarmDescriptionsModel dbAlarm = alarmsController.FindById(alarmDescId); if (dbAlarm == null) return NotFound(); // Update data DTOAlarmNoteModel notes = alarmsController.CreateNote(Convert.ToInt32(userId.Value), alarmDescId, note); return Ok(notes); } } [Route("{alarmDescId:int}/note/{noteId:int}"), HttpPut] [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.MAINTENANCE, Action = ACTIONS.WRITE)] public IHttpActionResult EditAlarmNote(int noteId, DTONewAlarmNoteModel newNote) { if (!ModelState.IsValid) return BadRequest(ModelState); var identity = User.Identity as ClaimsIdentity; // Find user id from the bearer token var userId = identity.Claims.Where(c => c.Type == USER_ID_KEY).FirstOrDefault(); using (AlarmsController alarmsController = new AlarmsController()) { // Check if alarm desc exists AlarmNoteModel dbNote = alarmsController.FindNoteById(noteId); if (dbNote == null) return NotFound(); // Check if user is different if (dbNote.UserId != Convert.ToInt32(userId.Value)) return Unauthorized(); // Update data DTOAlarmNoteModel notes = alarmsController.UpdateNote(dbNote, newNote); return Ok(notes); } } [Route("{alarmDescId:int}/note/{noteId:int}"), HttpDelete] [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.MAINTENANCE, Action = ACTIONS.WRITE)] public IHttpActionResult DeleteAlarmNote(int noteId) { if (!ModelState.IsValid) return BadRequest(ModelState); var identity = User.Identity as ClaimsIdentity; // Find user id from the bearer token var userId = identity.Claims.Where(c => c.Type == USER_ID_KEY).FirstOrDefault(); using (AlarmsController alarmsController = new AlarmsController()) { // Check if alarm desc exists AlarmNoteModel dbNote = alarmsController.FindNoteById(noteId); if (dbNote == null) return NotFound(); // Check if user is different if (dbNote.UserId != Convert.ToInt32(userId.Value)) return Unauthorized(); // Update data alarmsController.DeleteNote(dbNote.NoteId); return Ok(); } } #endregion Note #region Attachment [Route("{alarmDescId:int}/attachments"), HttpGet] [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.MAINTENANCE, Action = ACTIONS.READ)] public IHttpActionResult GetAttachmentsByAlarmId(int alarmDescId) { using (AlarmsController alarmsController = new AlarmsController()) { // Check if alarm desc exists AlarmDescriptionsModel dbAlarm = alarmsController.FindById(alarmDescId); if (dbAlarm == null) return NotFound(); List attachments = alarmsController.FindAttachmentByAlarmDescId(alarmDescId); return Ok(attachments); } } [Route("attachment/{attachmentId:int}"), HttpGet] public IHttpActionResult GetAttachment(int attachmentId) { using (AlarmsController alarmsController = new AlarmsController()) { // Check if attachment exist in db or physically AlarmFileModel attachment = alarmsController.FindAttachmentById(attachmentId); if (attachment == null) return NotFound(); if (!File.Exists(ALARM_ATTACHMENT_PATH + attachment.LocalFileName)) return NotFound(); return new FileResult(ALARM_ATTACHMENT_PATH + attachment.LocalFileName); } } [Route("{alarmDescId:int}/attachment"), HttpPost] [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.MAINTENANCE, Action = ACTIONS.WRITE)] public async Task AddAttachment(int alarmDescId) { var identity = User.Identity as ClaimsIdentity; // Find user id from the bearer token var userId = identity.Claims.Where(c => c.Type == USER_ID_KEY).FirstOrDefault(); // Check whether the POST operation is MultiPart? if (!Request.Content.IsMimeMultipartContent()) throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); // Create CustomMultipartFormDataStreamProvider CustomMultipartFormDataStreamProvider provider = new CustomMultipartFormDataStreamProvider(ALARM_ATTACHMENT_PATH); List files = new List(); // Read all contents of multipart message into CustomMultipartFormDataStreamProvider. var result = await Request.Content.ReadAsMultipartAsync(provider); AlarmFileModel attachment = null; using (AlarmsController alarmsController = new AlarmsController()) { // Check if alarm desc exists AlarmDescriptionsModel dbAlarm = alarmsController.FindById(alarmDescId); if (dbAlarm == null) return NotFound(); // TODO: Remove foreach foreach (MultipartFileData file in provider.FileData) { var fileName = Path.GetFileName(file.LocalFileName); files.Add(fileName); attachment = alarmsController.AddAttachment(file.Headers.ContentDisposition.FileName.Replace("\"", string.Empty), fileName, alarmDescId, Convert.ToInt32(userId.Value)); } } // Send OK Response along with saved file names to the client. return Ok(attachment); } [Route("attachment/{attachmentId:int}"), HttpDelete] [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.MAINTENANCE, Action = ACTIONS.WRITE)] public IHttpActionResult DeleteAttachment(int attachmentId) { var identity = User.Identity as ClaimsIdentity; // Find user id from the bearer token var userId = identity.Claims.Where(c => c.Type == USER_ID_KEY).FirstOrDefault(); using (AlarmsController alarmsController = new AlarmsController()) { // Get single file AlarmFileModel attachment = alarmsController.FindAttachmentById(attachmentId); // Check if exist in db or physically if (attachment == null) return NotFound(); // Check user if (attachment.UserId != Convert.ToInt32(userId.Value)) return Unauthorized(); alarmsController.DeleteAttachment(attachment); return Ok(); } } #endregion Attachment } }