diff --git a/Step.Database/Controllers/MaintenancesController.cs b/Step.Database/Controllers/MaintenancesController.cs index 8ae40077..e24a2962 100644 --- a/Step.Database/Controllers/MaintenancesController.cs +++ b/Step.Database/Controllers/MaintenancesController.cs @@ -285,6 +285,55 @@ namespace Step.Database.Controllers dbCtx.SaveChanges(); } + public List FindAttachmentByMaintenance(int maintenanceId) + { + return dbCtx + .MaintenanceFiles + .Where(x => x.MaintenanceId == maintenanceId) + .ToList(); + } + + public MaintenanceFileModel FindAttachmentById(int attachmentId) + { + return dbCtx + .MaintenanceFiles + .Where(x => x.AttachmentId == attachmentId) + .FirstOrDefault(); + } + + public MaintenanceFileModel AddAttachment(string fileName, string localFileName ,int maintenanceId) + { + MaintenanceFileModel file = new MaintenanceFileModel() + { + FileName = fileName, + LocalFileName = localFileName, + MaintenanceId = maintenanceId + }; + + dbCtx.MaintenanceFiles.Add(file); + + dbCtx.SaveChanges(); + + return file; + } + + public void DeleteAttachment(int attachmentId) + { + MaintenanceFileModel file = dbCtx.MaintenanceFiles.Where(x => x.AttachmentId == attachmentId).FirstOrDefault(); + if (file != null) + { + dbCtx.MaintenanceFiles.Remove(file); + + dbCtx.SaveChanges(); + } + } + + public void DeleteAttachment(MaintenanceFileModel attachment) + { + dbCtx.MaintenanceFiles.Remove(attachment); + + dbCtx.SaveChanges(); + } #endregion } } \ No newline at end of file diff --git a/Step.Database/DatabaseContext.cs b/Step.Database/DatabaseContext.cs index dc26869a..41eee8de 100644 --- a/Step.Database/DatabaseContext.cs +++ b/Step.Database/DatabaseContext.cs @@ -27,6 +27,7 @@ namespace Step.Database public DbSet Maintenances { get; set; } public DbSet PerformedMaintenances { get; set; } public DbSet MaintenancesNotes { get; set; } + public DbSet MaintenanceFiles { get; set; } // Create migration string public static string CONNECTION_STRING = "Server = " + "localhost" + "; Database=" + DATABASE_NAME +";Uid="+ DATABASE_USER +";Pwd="+ DATABASE_PWD +";"; diff --git a/Step.Database/Migrations/201806141227365_InitMigration.Designer.cs b/Step.Database/Migrations/201806191402402_InitMigration.Designer.cs similarity index 92% rename from Step.Database/Migrations/201806141227365_InitMigration.Designer.cs rename to Step.Database/Migrations/201806191402402_InitMigration.Designer.cs index 093e50f1..143a5daf 100644 --- a/Step.Database/Migrations/201806141227365_InitMigration.Designer.cs +++ b/Step.Database/Migrations/201806191402402_InitMigration.Designer.cs @@ -13,7 +13,7 @@ namespace Step.Database.Migrations string IMigrationMetadata.Id { - get { return "201806141227365_InitMigration"; } + get { return "201806191402402_InitMigration"; } } string IMigrationMetadata.Source diff --git a/Step.Database/Migrations/201806141227365_InitMigration.cs b/Step.Database/Migrations/201806191402402_InitMigration.cs similarity index 89% rename from Step.Database/Migrations/201806141227365_InitMigration.cs rename to Step.Database/Migrations/201806191402402_InitMigration.cs index d6954295..46905423 100644 --- a/Step.Database/Migrations/201806141227365_InitMigration.cs +++ b/Step.Database/Migrations/201806191402402_InitMigration.cs @@ -71,6 +71,19 @@ namespace Step.Database.Migrations }) .PrimaryKey(t => t.id); + CreateTable( + "dbo.maintenance_file", + c => new + { + id = c.Int(nullable: false, identity: true), + file_name = c.String(unicode: false), + local_file_name = c.String(unicode: false), + maintenance_id = c.Int(nullable: false), + }) + .PrimaryKey(t => t.id) + .ForeignKey("dbo.maintenance", t => t.maintenance_id, cascadeDelete: true) + .Index(t => t.maintenance_id); + CreateTable( "dbo.maintenance", c => new @@ -98,11 +111,11 @@ namespace Step.Database.Migrations id = c.Int(nullable: false, identity: true), message = c.String(unicode: false), user_id = c.Int(nullable: false), - maintenance_id = c.Int(), + maintenance_id = c.Int(nullable: false), timestamp = c.DateTime(nullable: false, precision: 0), }) .PrimaryKey(t => t.id) - .ForeignKey("dbo.maintenance", t => t.maintenance_id) + .ForeignKey("dbo.maintenance", t => t.maintenance_id, cascadeDelete: true) .ForeignKey("dbo.user", t => t.user_id, cascadeDelete: true) .Index(t => t.user_id) .Index(t => t.maintenance_id); @@ -140,6 +153,7 @@ namespace Step.Database.Migrations DropForeignKey("dbo.performed_maintenance", "maintenance", "dbo.maintenance"); DropForeignKey("dbo.maintenance_note", "user_id", "dbo.user"); DropForeignKey("dbo.maintenance_note", "maintenance_id", "dbo.maintenance"); + DropForeignKey("dbo.maintenance_file", "maintenance_id", "dbo.maintenance"); DropForeignKey("dbo.maintenance", "user_id", "dbo.user"); DropForeignKey("dbo.machine_user", "user_id", "dbo.user"); DropForeignKey("dbo.machine_user", "role_id", "dbo.role"); @@ -149,12 +163,14 @@ namespace Step.Database.Migrations DropIndex("dbo.maintenance_note", new[] { "maintenance_id" }); DropIndex("dbo.maintenance_note", new[] { "user_id" }); DropIndex("dbo.maintenance", new[] { "user_id" }); + DropIndex("dbo.maintenance_file", new[] { "maintenance_id" }); DropIndex("dbo.machine_user", new[] { "role_id" }); DropIndex("dbo.machine_user", "unique_machine_user"); DropTable("dbo.session"); DropTable("dbo.performed_maintenance"); DropTable("dbo.maintenance_note"); DropTable("dbo.maintenance"); + DropTable("dbo.maintenance_file"); DropTable("dbo.user"); DropTable("dbo.role"); DropTable("dbo.machine_user"); diff --git a/Step.Database/Migrations/201806141227365_InitMigration.resx b/Step.Database/Migrations/201806191402402_InitMigration.resx similarity index 52% rename from Step.Database/Migrations/201806141227365_InitMigration.resx rename to Step.Database/Migrations/201806191402402_InitMigration.resx index 6e0f7d04..758334fd 100644 --- a/Step.Database/Migrations/201806141227365_InitMigration.resx +++ b/Step.Database/Migrations/201806191402402_InitMigration.resx @@ -118,7 +118,7 @@ System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - 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 dbo diff --git a/Step.Database/Step.Database.csproj b/Step.Database/Step.Database.csproj index 72bcd6fd..acc8a298 100644 --- a/Step.Database/Step.Database.csproj +++ b/Step.Database/Step.Database.csproj @@ -77,9 +77,9 @@ - - - 201806141227365_InitMigration.cs + + + 201806191402402_InitMigration.cs @@ -115,8 +115,8 @@ - - 201806141227365_InitMigration.cs + + 201806191402402_InitMigration.cs diff --git a/Step.Model/Constants.cs b/Step.Model/Constants.cs index 5de97765..59ba192d 100644 --- a/Step.Model/Constants.cs +++ b/Step.Model/Constants.cs @@ -100,7 +100,9 @@ namespace Step.Model // Filenames - // Config File Names + public const string MAINTENANCE_ATTACHMENT_PATH = "C:\\CMS\\STEP\\attachment\\"; + + // Config File Names public static readonly string BASE_PATH = Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location); public const string CONFIG_DIRECTORY = "Config\\"; public const string SERVER_CONFIG_SCHEMA_PATH = CONFIG_DIRECTORY + "serverConfigValidator.xsd"; diff --git a/Step.Model/DTOModels/MaintenanceModels/DTOMaintenanceNoteModel.cs b/Step.Model/DTOModels/MaintenanceModels/DTOMaintenanceNoteModel.cs index 48d81172..4573a74e 100644 --- a/Step.Model/DTOModels/MaintenanceModels/DTOMaintenanceNoteModel.cs +++ b/Step.Model/DTOModels/MaintenanceModels/DTOMaintenanceNoteModel.cs @@ -21,7 +21,6 @@ namespace Step.Model.DTOModels.MaintenanceModels public DateTime DateTime { get; set; } public DTOMessageUserModel User { get; set; } - public static explicit operator DTOMaintenanceNoteModel(MaintenanceNoteModel note) { @@ -35,4 +34,4 @@ namespace Step.Model.DTOModels.MaintenanceModels }; } } -} +} \ No newline at end of file diff --git a/Step.Model/DatabaseModels/MaintenanceFileModel.cs b/Step.Model/DatabaseModels/MaintenanceFileModel.cs new file mode 100644 index 00000000..3d0e8bcb --- /dev/null +++ b/Step.Model/DatabaseModels/MaintenanceFileModel.cs @@ -0,0 +1,30 @@ +using System; +using System.Collections.Generic; +using System.ComponentModel.DataAnnotations; +using System.ComponentModel.DataAnnotations.Schema; +using System.Linq; +using System.Text; +using System.Threading.Tasks; + +namespace Step.Model.DatabaseModels +{ + [Table("maintenance_file")] + public class MaintenanceFileModel + { + [Key] + [Column("id")] + public int AttachmentId { get; set; } + + [Column("file_name")] + public string FileName { get; set; } + + [Column("local_file_name")] + public string LocalFileName { get; set; } + + [Column("maintenance_id")] + public int MaintenanceId { get; set; } + + [ForeignKey("MaintenanceId")] + public MaintenanceModel Maintenance { get; set; } + } +} diff --git a/Step.Model/DatabaseModels/MaintenanceNoteModel.cs b/Step.Model/DatabaseModels/MaintenanceNoteModel.cs index 55c035bf..969c4b47 100644 --- a/Step.Model/DatabaseModels/MaintenanceNoteModel.cs +++ b/Step.Model/DatabaseModels/MaintenanceNoteModel.cs @@ -26,7 +26,7 @@ namespace Step.Model.DatabaseModels public UserModel User { get; set; } [Column("maintenance_id")] - public int? MaintenanceId { get; set; } + public int MaintenanceId { get; set; } [ForeignKey("MaintenanceId")] public MaintenanceModel Maintenance { get; set; } diff --git a/Step.Model/Step.Model.csproj b/Step.Model/Step.Model.csproj index acd0db73..456e8864 100644 --- a/Step.Model/Step.Model.csproj +++ b/Step.Model/Step.Model.csproj @@ -72,6 +72,7 @@ + diff --git a/Step/Controllers/SignalR/NcHub.cs b/Step/Controllers/SignalR/NcHub.cs index da07c31f..6f8d3cd4 100644 --- a/Step/Controllers/SignalR/NcHub.cs +++ b/Step/Controllers/SignalR/NcHub.cs @@ -72,7 +72,7 @@ namespace Step.Controllers.SignalR // Call the library functions libraryError = ncHandler.RefreshAllAlarms(); } - MessageServices.Current.Publish(SHOW_MSG_UI, null, "Refresh All Alarms."); + // MessageServices.Current.Publish(SHOW_MSG_UI, null, "Refresh All Alarms."); } [SignalRAuthorize(FunctionAccess = ALARM_CMD, Action = ACTIONS.WRITE)] @@ -87,7 +87,7 @@ namespace Step.Controllers.SignalR throw new HubException(libraryError.localizationKey); } - MessageServices.Current.Publish(SHOW_MSG_UI, null, "Refresh Single Alarm. ID: " + id); + // MessageServices.Current.Publish(SHOW_MSG_UI, null, "Refresh Single Alarm. ID: " + id); } [SignalRAuthorize(FunctionAccess = ALARM_CMD, Action = ACTIONS.WRITE)] @@ -102,7 +102,7 @@ namespace Step.Controllers.SignalR throw new HubException(libraryError.localizationKey); } - MessageServices.Current.Publish(SHOW_MSG_UI, null, "Recovery Alarm. ID: " + id); + // MessageServices.Current.Publish(SHOW_MSG_UI, null, "Recovery Alarm. ID: " + id); } [SignalRAuthorize(FunctionAccess = NC_SOFTKEY, Action = ACTIONS.WRITE)] diff --git a/Step/Controllers/WebApi/MaintenanceController.cs b/Step/Controllers/WebApi/MaintenanceController.cs index 0344a5e7..5b05f48a 100644 --- a/Step/Controllers/WebApi/MaintenanceController.cs +++ b/Step/Controllers/WebApi/MaintenanceController.cs @@ -1,16 +1,24 @@ -using Step.Database.Controllers; +using Newtonsoft.Json; +using Step.Database.Controllers; using Step.Model.DatabaseModels; using Step.Model.DTOModels.MaintenanceModels; using Step.NC; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; +using System.IO; using System.Linq; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; using System.Security.Claims; +using System.Threading; +using System.Threading.Tasks; +using System.Web; using System.Web.Http; using static CMS_CORE_Library.DataStructures; -using static Step.Model.Constants; using static Step.Config.ServerConfig; +using static Step.Model.Constants; namespace Step.Controllers.WebApi { @@ -51,7 +59,7 @@ namespace Step.Controllers.WebApi var userId = identity.Claims.Where(c => c.Type == USER_ID_KEY).FirstOrDefault(); if (userId == null) return Unauthorized(); - + using (MaintenancesController maintenancesController = new MaintenancesController()) { MaintenanceModel dbMaint = maintenancesController.Create(newMaint, Convert.ToInt32(userId.Value)); @@ -62,7 +70,7 @@ namespace Step.Controllers.WebApi CmsError cmsError = ncHandler.GetMaintenanceData(out DTOMaintenanceModel maintenance, dbMaint.MaintenanceId, Convert.ToInt32(userId.Value)); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); - + return Ok(maintenance); } } @@ -179,7 +187,6 @@ namespace Step.Controllers.WebApi 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(); @@ -206,7 +213,7 @@ namespace Step.Controllers.WebApi { 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(); @@ -261,6 +268,7 @@ namespace Step.Controllers.WebApi return Ok(); } } + [Route("maintenance/{maintenanceId:int}/performe"), HttpPost] @@ -298,5 +306,133 @@ namespace Step.Controllers.WebApi } } } + + [Route("maintenance/{maintenanceId:int}/attachment"), HttpPost] + public async Task AddAttachment(int maintenanceId) + { + // Check whether the POST operation is MultiPart? + if (!Request.Content.IsMimeMultipartContent()) + throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); + + // Create CustomMultipartFormDataStreamProvider + CustomMultipartFormDataStreamProvider provider = new CustomMultipartFormDataStreamProvider(MAINTENANCE_ATTACHMENT_PATH); + // MultipartFormDataStreamProvider provider = new MultipartFormDataStreamProvider(MAINTENANCE_ATTACHMENT_PATH); + List files = new List(); + + // Read all contents of multipart message into CustomMultipartFormDataStreamProvider. + var result = await Request.Content.ReadAsMultipartAsync(provider); + + MaintenanceFileModel attachment = null; + using (MaintenancesController maintenancesController = new MaintenancesController()) + { + // Remove foreach + foreach (MultipartFileData file in provider.FileData) + { + var fileName = Path.GetFileName(file.LocalFileName); + + files.Add(fileName); + attachment = maintenancesController.AddAttachment(file.Headers.ContentDisposition.FileName.Replace("\"", string.Empty), fileName, maintenanceId); + } + } + + // Send OK Response along with saved file names to the client. + return Ok(attachment); + } + + [Route("maintenance/{maintenanceId:int}/attachments"), HttpGet] + public IHttpActionResult GetAttachments(int maintenanceId) + { + using (MaintenancesController maintenancesController = new MaintenancesController()) + { + return Ok(maintenancesController.FindAttachmentByMaintenance(maintenanceId)); + } + } + + [Route("attachment/{attachmentId:int}"), HttpGet] + public IHttpActionResult GetAttachment(int attachmentId) + { + using (MaintenancesController maintenancesController = new MaintenancesController()) + { + // Get single file + MaintenanceFileModel attachment = maintenancesController.FindAttachmentById(attachmentId); + // Check if exist in db or physically + if (attachment == null) + return NotFound(); + if (!File.Exists(MAINTENANCE_ATTACHMENT_PATH + attachment.LocalFileName)) + return NotFound(); + + return new FileResult(MAINTENANCE_ATTACHMENT_PATH + attachment.LocalFileName); + } + } + + [Route("attachment/{attachmentId:int}"), HttpDelete] + public IHttpActionResult DeleteAttachment(int attachmentId) + { + using (MaintenancesController maintenancesController = new MaintenancesController()) + { + // Get single file + MaintenanceFileModel attachment = maintenancesController.FindAttachmentById(attachmentId); + // Check if exist in db or physically + if (attachment == null) + return NotFound(); + + maintenancesController.DeleteAttachment(attachment); + + if (File.Exists(MAINTENANCE_ATTACHMENT_PATH + attachment.LocalFileName)) + File.Delete(MAINTENANCE_ATTACHMENT_PATH + attachment.LocalFileName); + + return Ok(); + } + } + } + + public class FileResult : IHttpActionResult + { + private readonly string FilePath; + private readonly string ContentType; + private readonly string FileName; + + public FileResult(string filePath, string contentType = null, string fileName = null) + { + FilePath = filePath; + ContentType = contentType; + FileName = fileName; + } + + public Task ExecuteAsync(CancellationToken cancellationToken) + { + return Task.Run(() => + { + // Create response + var response = new HttpResponseMessage(HttpStatusCode.OK) + { + Content = new StreamContent(File.OpenRead(FilePath)) // Set file + }; + // Set header content type + var contentType = ContentType ?? MimeMapping.GetMimeMapping(Path.GetExtension(FilePath)); + response.Content.Headers.ContentType = new MediaTypeHeaderValue(contentType); + response.Content.Headers.ContentDisposition = new ContentDispositionHeaderValue("attachment") + { + FileName = FileName + }; + + return response; + }, cancellationToken); + } + } + + // Override MultipartFormDataStreamProvider to override the GetLocalFileName + public class CustomMultipartFormDataStreamProvider : MultipartFormDataStreamProvider + { + public CustomMultipartFormDataStreamProvider(string path) : base(path) + { + } + + public override string GetLocalFileName(HttpContentHeaders headers) + { + var fileName = headers.ContentDisposition.FileName.Replace("\"", string.Empty); + + return Path.GetFileNameWithoutExtension(fileName) + Guid.NewGuid() + Path.GetExtension(fileName); + } } } \ No newline at end of file