From 110ab7be656c1d33f94ff84ac55941846c66e49c Mon Sep 17 00:00:00 2001 From: Lucio Maranta Date: Wed, 24 Oct 2018 11:25:38 +0200 Subject: [PATCH] Alarm attachments --- Step.Config/Config/serverConfig.xml | 2 +- Step.Database/Controllers/AlarmsController.cs | 90 +++++++++- Step.Database/DatabaseContext.cs | 1 + .../201810231526097_InitMigration.resx | 126 -------------- ...201810240848483_InitMigration.Designer.cs} | 2 +- ...on.cs => 201810240848483_InitMigration.cs} | 51 ++++-- .../201810240848483_InitMigration.resx | 126 ++++++++++++++ Step.Database/Step.Database.csproj | 10 +- Step.Model/Constants.cs | 3 +- Step.Model/DatabaseModels/AlarmFileModel.cs | 36 ++++ Step.Model/DatabaseModels/NcFamilyModel.cs | 2 +- Step.Model/Step.Model.csproj | 1 + Step/App_Start/Startup.cs | 2 + Step/Controllers/WebApi/ApiAlarmController.cs | 159 ++++++++++++++++-- .../WebApi/ApiMaintenanceController.cs | 134 +++++---------- .../CustomMultipartFormDataStreamProvider.cs | 63 +++++++ Step/Step.csproj | 1 + 17 files changed, 555 insertions(+), 254 deletions(-) delete mode 100644 Step.Database/Migrations/201810231526097_InitMigration.resx rename Step.Database/Migrations/{201810231526097_InitMigration.Designer.cs => 201810240848483_InitMigration.Designer.cs} (92%) rename Step.Database/Migrations/{201810231526097_InitMigration.cs => 201810240848483_InitMigration.cs} (94%) create mode 100644 Step.Database/Migrations/201810240848483_InitMigration.resx create mode 100644 Step.Model/DatabaseModels/AlarmFileModel.cs create mode 100644 Step/Provider/CustomMultipartFormDataStreamProvider.cs diff --git a/Step.Config/Config/serverConfig.xml b/Step.Config/Config/serverConfig.xml index 66484c93..dbc8112d 100644 --- a/Step.Config/Config/serverConfig.xml +++ b/Step.Config/Config/serverConfig.xml @@ -1,7 +1,7 @@ - SIEMENS + DEMO true localhost 8080 diff --git a/Step.Database/Controllers/AlarmsController.cs b/Step.Database/Controllers/AlarmsController.cs index cdec0741..b405a892 100644 --- a/Step.Database/Controllers/AlarmsController.cs +++ b/Step.Database/Controllers/AlarmsController.cs @@ -1,10 +1,13 @@ using Step.Model.DatabaseModels; +using Step.Model.DTOModels; using Step.Model.DTOModels.AlarmModels; using System; using System.Collections.Generic; using System.Data.Entity; using System.Diagnostics; +using System.IO; using System.Linq; +using static Step.Model.Constants; namespace Step.Database.Controllers { @@ -118,7 +121,28 @@ namespace Step.Database.Controllers } #region NOTES - + + public List GetNotesByAlarmDescId(int alarmDescriptionId) + { + return dbCtx + .AlarmsNotes + .Where(x => x.AlarmDescriptionId == alarmDescriptionId) // Filter by id + .Select(x => new DTOAlarmNoteModel() // Convert to return model + { + Id = x.NoteId, + DateTime = x.DateTime, + Message = x.Message, + User = new DTOMessageUserModel() + { + Id = x.User.UserId, + FirstName = x.User.FirstName, + LastName = x.User.LastName, + Username = x.User.Username + } + }) + .ToList(); + } + public AlarmNoteModel FindNoteById(int noteId) { return dbCtx @@ -166,5 +190,69 @@ namespace Step.Database.Controllers } #endregion NOTES + + #region Attachment + + public List FindAttachmentByAlarmDescId(int alarmDescId) + { + return dbCtx + .AlarmFiles + .Where(x => x.AlarmDescriptionId == alarmDescId) + .ToList(); + } + + public AlarmFileModel FindAttachmentById(int attachmentId) + { + return dbCtx + .AlarmFiles + .Where(x => x.AttachmentId == attachmentId) + .FirstOrDefault(); + } + + public AlarmFileModel AddAttachment(string fileName, string localFileName, int alarmDescId, int userId) + { + // Create obj + AlarmFileModel file = new AlarmFileModel() + { + FileName = fileName, + LocalFileName = localFileName, + AlarmDescriptionId = alarmDescId, + UserId = userId + }; + // Add to db + dbCtx.AlarmFiles.Add(file); + + dbCtx.SaveChanges(); + + return file; + } + + public void DeleteAttachment(int attachmentId) + { + // Get attachmentRow + AlarmFileModel file = dbCtx + .AlarmFiles + .Where(x => x.AttachmentId == attachmentId) + .FirstOrDefault(); + + if (file != null) + { + dbCtx.AlarmFiles.Remove(file); + + dbCtx.SaveChanges(); + } + } + + public void DeleteAttachment(AlarmFileModel attachment) + { + dbCtx.AlarmFiles.Remove(attachment); + + dbCtx.SaveChanges(); + + if (File.Exists(ALARM_ATTACHMENT_PATH + attachment.LocalFileName)) + File.Delete(ALARM_ATTACHMENT_PATH + attachment.LocalFileName); + } + + #endregion Attachment } } \ No newline at end of file diff --git a/Step.Database/DatabaseContext.cs b/Step.Database/DatabaseContext.cs index 0de6a26e..c973b87b 100644 --- a/Step.Database/DatabaseContext.cs +++ b/Step.Database/DatabaseContext.cs @@ -41,6 +41,7 @@ namespace Step.Database public DbSet AlarmOccurrences { get; set; } public DbSet AlarmUsers { get; set; } public DbSet AlarmsNotes { get; set; } + public DbSet AlarmFiles { 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/201810231526097_InitMigration.resx b/Step.Database/Migrations/201810231526097_InitMigration.resx deleted file mode 100644 index 0995e19a..00000000 --- a/Step.Database/Migrations/201810231526097_InitMigration.resx +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - text/microsoft-resx - - - 2.0 - - - System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 - - - H4sIAAAAAAAEAO1dWW/kOJJ+X2D/QyIfZ3uc5SrMYKdgzyDbdvUY42udru7ZJ4FWMtNC68jW4bZ7sb9sH/Yn7V9YUlJKvA9RR2bNoFCAUySDwYiPwSuC/L//+d+zv7xF4ewVplmQxOfz05MP8xmM/WQdxNvzeZFvfv/v87/8+V//5exqHb3Nftzn+4TzoZJxdj5/yfPd58Ui819gBLKTKPDTJEs2+YmfRAuwThYfP3z40+L0dAERiTmiNZudPRZxHkSw/IF+XiSxD3d5AcLbZA3DrP6OUlYl1dkdiGC2Az48n69yuDu5BDl4Bhmcz5ZhABATKxhu5jMQx0kOcsTi568ZXOVpEm9XO/QBhE/vO4jybUCIS5Wsf26zm7biw0fcikVbcE/KL7I8iSwJnn6qxbJgi3cS7rwRGxLcFRJw/o5bXQrvfL4MQRpdwsxPgx2uIitFPZ+xVX++CFNcrJZ0mauRd6WeEzGt72Ztie8arCBI4X/fzS6KMC9SeB7DIk8ByvFQPIeB/zf4/pT8DOPzuAhDsgmoESiN+oA+PaTJDqb5+yPckA27Xs9nC7rwgi3dlGULVs29jvNPH+ezO8QGeA5hgxVCNKs8SeEPMIYpyOH6AeQ5TJGq75IYctUzlT0FeQj3VSFkov41n92CtxsYb/OX8zn6cz77ErzB9f5LXf3XOEDdERXK04Kp5WzRalmv+3vfL9IUdW7orHqW1JSab3npjAGahCsartewlL8OEWwn4upWF18lReq3iEL272R5s3y89Vb3Xx8vrgSsawCK6AioPf3ngz0t9BNBI4OZTpq6PhMhIw6i3Z4MwiLEH/WU7sBrsC3VpJH6fPYIwzJj9hLs9k0Xgdzji35Jk+gxCWU9jCvhNUpLrIo9gXQLc/NGosEvzeQtw8lETW39XIukORuWqJbIs+8b3t18NbQd7FZDYyKDhevnrdRQtm1fm0sXtLaPVv2QRN6QYBV2Oz22bbqbSQOqfFKu8V86Vss8Iv6MO5NjPzrMLtRXZ+hvdMf1xSDqY8pn2WW/BGmW3/VTtbqmGzBSRQ8gy35N0vXgFa0gMgJIu9SsY7DavBDE2wJsp10X3CU5dB1YGxoTWQVcfxersC83llW4RbPi/vU94NCvWp9Y0msn7xNM5huA6mfx8qziwVmRv9+JRFuRcCJBJ+t4dZ9IXD7f+V9AFITvDtaDITKR+ag46GJA2pJN1zj942CbSKMMtk9JEpKbAd+/5/aTkMdg+5Kvgt/cqNzAjTuRJ3/3hLM7EfkBRBFwk0itf2fRXiD9IM1XZR3oILSsdhA6WnUMvwSs3TgJYkzjwc+XRZ6EzuQqlvoid/mO5vGBf5FEOxhn9fa8e2t7J1u1um+yN8EGOkP2LomCGISYlhvaHuFr8AovYZgDS0LSMRebO/FeGR6bcGo1YFaWnhx1Rencvpgwk9NuGEWx+6jbkJhozMX1dxlx9+XGGG/vN5sM5tVgqqtRB9wsWBf9dIGKUtUV3GihZW5eZE5d23QCpGHkBcQ/c0T6VOL1+pShblbqY6dSn9SlpMZob2T6skbsIkBpskyZLJVlwGOdT8ZimazhsMrjvEwpyTjay5bGRAaz6SO2FlPcuQYymd+DMCw2VieZt2ALfgti+JBkQS8z5D3Ba2bip9lkrKvXlJJ2C7YZ0h7SIsnjy9C9RZFV2HNU+W27uenEyKibq6dFtCno3M3ZJjv2eCG5iTo/CWmD00MSy7bmQtZ7bH0AJN3JwS2h2/ItyHDulguEOghiDR1j3H0Br0ka5BDvp62STf4zdNkOk1GbasipWDAEXdejOaIWl8ms/Z63uZKL2McqXPrYrcVFvzyhqbY8KU46bX1yFMY6RRllG/Qn3A9v4CsMb4PYdckG1v1QWqYQDN7yq7iDwRQMAKE/UHe8Bf4LGqAc+iFJYbIRvWSh2wjdFB3t4LKS9dDHlnHwS0G0a+zz8Fqwji4yLJVpAdZ1VGaKjwY0U2wPfwCOVyr9ObzVDRMuqFjEeE3mdlUly8OtA6UZbReAmJwZu1VOBa/4s57RMldvZ+YcefbUXJhBz6X7yTkm7GBfmuITGZZ9v7C1KGb96cimieW8bqBZThDnMAaxD78EToARUZoqZCPPUX+KkAI7RWtQpcfCEZbZOFhKfBCOVhuBikFGW/OBseFDYsd59HpUIdKkq/MKrLumQI/DkaAmfkiSZDJj3H1oIsj2Y3CmnQFTCLefAVt0kH5OTxB1mL6CZkC5TIrSc0mzxQnBOiyni7aelboYsNvl9d3T1d3y7uKqWyTYRVLgJrkamCGiJ0VyJLxCh1/q5vebWwgyhHypzL/eXT9591+826vl6uvjlVbaKSwhiAHgDAbs3X/1tgtSBckBhwUTQ6o1omYGdADj6ehUL6I0kRHtYjn/6VIv4bW/KdcA3vQWE7HWj1w/ERPmVXVHcYEhJmJyj3ppJjPG3W3JA0w3SRrBdT8zMim5iayKiJ8ulkZGZyzr08tIW0+SfgRh4ejQ16OBKUmh/64ru5KEsCNKMemRBds+aZKf655GhWxti85SairlzaVRAdu2KQynsRn6jwIW8DqHkcupN0PkYCYyYstU3V0xzaTHZI3YMDhKZSDN0adtCqJRNqUe4c7x0pBHGCHwI+7cSS2fsyQscogk9jJ4y2lf7F53klcILm7ucCSFqXyRKhY6ORi1RceaF5RtHWEL1+KMVrfJnWb5TbJtPVR6WVE0/AnHSRJWHpW5HRplebjRUJrRbgAsIqLn0DcqXWdfQrBtb5Ez6kkXqMU5iPPs30hifXQihJU1TMN3hC1S87RubmH0DNP9idjFfFbOMs/nHzgtUjkfbtqsp7zoKiFpBVdtGfYiNkxqGqFdPT7eP5rK7afl49313Q9OsuM3XR0lyBKcSI5/f/Aul09XpqK8XV789fruysO8P/64vJHJlC33dH0rKPTRURHcTmyPOmFoT6OeKDJVzKWpJv4qkz6n6ibjJxM1LbMs8YNSyntzY3ZhG83CVbyedbu9rd2sl9yseIt0FOyQVtAQcz7/Hdd666qb+AmmasGFnnTdH05OeC2hWRVM8UQGhCUiU7xc5KdgQewHOxB24pShJnYGEN/cidXeVM6mXMIdjPEkrJPqjLli7j3hGWz4YOaiOtGeLQj0GoBafv2ZElEGd6ExSCKcHi3Ra3BJoGWHOWUVdXYfX8IQ5nC2LH3Oz+cXIPPBmp+LIoOx7gvs2oYZw0l1kZ893LXK7Y2v8VFeTv8N4UYvAwbAM7V8ICqQ0j444JItMEGF9IbKzhAlleTGwVhgVNwVpcSNycVRDEiJY2JLkBrcOmU9VzgQ9OqbNurkQq/W45tVMAefhkhT2ts+oHys9lbcgjHtrVhJB29vhZdayMCivuGiRQtzQY45GtUX+tAVUDffHRooVQ0xwYTsPjwrXKrU5crESNBU3dSgApHRtQ00nsgrSuwQa3LnA1OZ5KKEoXYODLk0AYXqHgTxca70JgRrMBtodYImjG6lq/s+zGwoc8dP7zaauVzEtEv1C20JOyaqldzp42BnKYk7sjACtKSRjzL968MgCU9qLpzXHGfaKEq+ngOdDOhaYmazJMHqVkjV6c6ZkykAW8a+GqOIDoQdCKpUHC1RCRF3evAgJdtgggtxUKobPEllufEwBTCVK3tN7PNAwDzC9b2yDSOt8JXKOvg1vjheR44ZZfAOCUzWL94GmKrYHxNg9jeDVPIyGsAUQj8mgIkDhA1goIkWFsKOiMrvBD11wLEF1A/BSpq1ymyGp4gI6QprpX574WoqoJtaU1k8+cDQPgzLKuZnfOsqVsIxWVhx5J8BJDRhgEIYdjpTMo4kPFYLq2zVZBZWqd8jtLCGR6QGgaIDQ/soF1WadoxvmY/0ANUohlIGJ7uAyhZZithkcyxbBWaOO3GwYW0kpNqoytjYNtG9hwhdzczCMmJ2XPAe80TDqmnjzjasdH4sUw5pDJwMe/qAuBZudOSnOb61sXQWO8TTQ1rXGjOoKG7TtUKxTn+9cNM7cKtwSVSmGjXa6y/KMGH8Hb7lgigoxGIdCJXVMa0s5jDdFcwlfpLZfNZGamq8WTk4C0gToQcyynx0gglhrAspSaJzaGjJyJhTKCvM8HxWyg6x+NAQK52wAiElzgtOQ6p+T0ZIh3AF0VAp3RVkZEiPDw0d1oNHRlLiKqUVG/eOh6gC+eMhOvr12wtZ9fiCiLToyQqtTEqrIiJHuzgY0pFhmR8xNASx4RQRIg60tSxRe3BirkTbn+Z0NTTt6cm6sHgXQUNYNHcSEVdMjzU1lLe8CChyV8joeng1PoqYo6czDB1i4JLbfLEj/3xGFFYNBZqIEGoOZRlU2ohBNFBxA3znAFK2GnqoZedftExN5S2PWZTJ2TDKkW+4Ps6RbXBtlHQS1Qc1WijMXZDVrRha6fELB1XLqFWDs5yo9QFBTUioq0QUsVky6ZiGc/FtMwjoYqW2N9o6sRmEb43RU9kLELUiNAGYZB/cXVRDI0z8xCovE33UCtUKZdwK0Yx6gqyQhzJAhaDUztp7kYnywUqxeIwjJ7j2mcROEE3drwc0UjMJkiCoClYHPaOrfjVTBy6Bs70CEbS7vQO0aL96rbg7SEP+5A0vEjMnceakTOMmTimbWq4ohKR1ChdQHUJWpc+xiaB452R1eyj35H5ERDkjEyTrNV3/wpGNZAYOsuqWyEYzB+EMPaJJ7koXCUfrpCk7idYJh1xuKmWj8skcVjaSd0WUYjJwNZS1T+1sKBZevWthJkC1Z6GhdvoSqQHkVN5s+jYaQK+j9EaEoORGdaXYDHyxZG1Ue2NJEKKfsBv7Xo2CQf3qxtDfR99GE/PXUXxDg9DsGm5edvauJ92dT4hmSzYyFVK18jQZX8Dyrt7BQ8LBR2JIGY/W++U3yvLiNTt5tzt7J5dKzT62Qm7ag3bTeaZCVvu7bpvD2ybtbLHyX2AE6g9nC5TFh7u8ANU6MNsn3ILdLoi3WVuy/jJb7YCP2nHx+9V89haFcXY+f8nz3efFIitJZydR4KdJlmzyEz+JFmCdLD5++PCnxenpIqpoLPyMFDl71NzUlCcp2EImFb+esIbl7cX7w+j57GIdcdnYo2rJIcS+NtlpNK/K/RnFviT+e3+lN9w1N2nLTq354/6a0BfUWvzUYdlwqNoNlBBCpFY+QJnZa833NyNdJGERxdXHQHgbgYxE/R4XSSCvPgluNFgwDeKcFTgZcl4gtHLMVUfuyTtqjvMK6Kg4PR2l3ugb+7prUHQfFUkNF4k8O5p7I0jSyepvFtgqH6GjoFV+MadQv5CABxSSzK79bIP0CK5yEO1YtEcwqz4fFuKrwcER6+3JfEeQKwjIBL33ZSKlXOCRsAOu5Z2kgnWC08vDPDHxiRToqjsXtfWkMTtlYQoxiCCv9eqrOaVyAnDHkdrgz54tMfzyIU8rBB1IPYAs+zVJGSntmq8WxhUizGJt8cYoq5M8qUWSEfVCEG+L8vk8uqn7rwfTN8gjQ0fr1jrNdLRuCgIyQeMibn2leeeQJBHtP9r1ub7srHb+sEYZLAm3z44c+njbnLJ2xyPrQ2kPSC0FqcVsrtfrjkneSNraR3zk6D7hewy2L/kq+I0hk+LPXlZ+t7D+cCOgFaKv1qSe/N0TeOZWSv7Oy4HgXWcVqR9AFAGazrb6ZCGm2imbF3hap3i2kr9A+kPw/P49Zyj6VYL3XKZYmDnwttpByMAyAm9eVn22InWTAAGlsPxqQSiIMaEHP18WeRLyNIO4pOnt/NwDTRZrTuUV1Ex3ruDyHXXMwL9Ioh2MM1B5bpA1rKsMnk/lsBaRtp5GVGSFHUSlr2gvsq4V3QQbyHeUEH217iR3CWo2CDFFxlpWCV5Yplh0ZPgavMJLGOaMSUjLBDTslikHM1JW7iduw2QbItBtkFSUVw1ObgPk/WaTwbx64o2mk5QpXlgn2eg+C9aFCE1pndIBTlXBClYSommdaLFiqV80pJYq9TeLlZ1wnrKpfN8s96f2V11SHJWuTl3Uer0+Fem0/GxP66OYFvdykgmtT2Janw7IJNSOZG42gYj36WYUVASsUGSHn+9BGBYbmsJz/c1mKKSdFPnRKqpzeLu9r6Pt0EVeViykbNdw8ipjakNkz99B7cfxXqBucBXHknVDriGtw9brcEcAl0GGV1gMO+vm68FgTBgp2B1m0ohCe5SZk5KfB5WlhLtNWZVmCQzLzaupdMpEZzqoUxDF2UGTJlSk8y+q8NT7RT9hRN7AVxjeBsyK71echCbUKM2LAqvV6yMEazHRFKV0o7lERZkt0fKLOYWrWGDCYCy1YFLjHPqcXQ5l27KTDbW1t3z3vkKFKNt3EnVx+TjaXEfusLVfxbO69IuvcfBLwbFRlF8PU9Ouh51cEHlnlXc4+mTu33BQvRg/UR1XMujoKN8mDjmGUhzFcVA4quJHuuOnvTvAHjiKsjZCHXvwLIc49ljjlQ+ln1CrnM++i4EQ3OfQxUiYkJHOAvIcdWVM2E35uGoeABv01d67IUFfxfRCnOR1ospcpUUbs9YD+Fuc7lMuzL3gtQesWg9oUvXZqewakUlfAWNmgvqr0NRI1/Bo7h2WIaHUGr75OuZ+wkVS4CawsvGrz7bbGxbes3LhEDcf0PIhEqwmkPn95haCrEhZfyyU5CUbL9onWogNLXkwJ9ipg5FcneKtgd0BMXbOunrbBamEcOmmBZsM1vSPz+a4OkUJ7xNyMj4dHKS+KeeoQQbD43GMEocPdQeo/E4qe5Ra0JLupwhIuMGXt2K2Vqsen34EYcE54lRD1GuV1DeIrSk2lw5zBMuU7LDsbHWpWXfospef2QNWS2EYi1rHUAgjKOwcoNMcfdqmIOLXGzuU6O2qVOsVxyPcMeyl5RcbChh3SPgiUnWSZ0t0+ZwhOjl8AKzLB6hTvB2wc/mwc6SY6kB/H+7YvbNQ1/vZ9xR1calwq1KO8XDJz5CZh+fVJ+utQNEUZL8d2GEqUgZG3CRb9mCjiowIq4SRQcQFpLJZmtrrL83vJiC1DgalolRLEeCY07LpWR2YykaHVlnmMySn12CNI0Nv31e/hCUKT8o/L8IANbjNcQviYIMmWaWSz+d/OPnDfLYMA5BVccR13Otn9upjo0DY0084EBauowVb3D6cFlPJsjWFfaL3SRz3RcPK2d/gO6tw/hJqHohnC7bgGQNHXKa60DPAIr4rwhCfZ2GHrjDjLwBnSter5IpAmMTb6tLplkp5wTRFhASqXi7q4MzRxFJath8g6hloGrhGIwmawMV4RIcl19Zya4M5iUq4q7qv4zV8O5//V1no8+z6796+3Hez+xR1hM+zD7P/VoubrzujbqXvpPVyr6Z7eSLu0wV6zTqrIoJn6Hm5HHtIoR9kZY//oKFrh0bJwZQZDKVjhSCvPipSD+GmPjuI1cVkCLOAN81+F6CTFCwYMlaqkz4P0Ky0gZpyi2xEiAzTtDHuPCUiSNONUBui6UaHjc10bd4+MHO4MVCyeXe0KG22Ad1EP7l9a2Ipu5i2urATGyMPgcrIxjHQmEUgDLvMFfqwP+Skp8iD+L0LI2QApCMpIv7RkRIR/uhIqQ6AdBUSHfvoSI2Oe3QkRoQ9dp+5thGPrtyIwxx7aGP/VMXxjH0JgI4p7EsAvVIlAhUdKdFBit1xSMcmmtKxGi4kMX4HPVgwgYCO1JgYQBdtMXF/3Untt6odcUiE/LFCMpgGNaWdpkBtsGAHFvaFXXZTiBBDOVJsCH3si9AnO0JW/VoWpjdcx6bioFjgGuiaKO8RQVAuqqdiqQZg6dSepR7M3z7sUWheTHiQxThaWRsrNBqE3pkBUxlsJ8iviKZzRLTtjqoKig67u92ne01gX0XoGU0E+lK5WRycxaasKvTNfCPXcEeWrKz7EC7a/OhJurrYtKPdd+pjF4CLaXOZ0NGRbN0pVXFsbg1rwtiM+6vACoXcflg/mJSHgv1Dg5GIJhtk91kdjnW0oidjuSy2bmtpk64f7VTtu9l1dhEiCjCF68+zJyR0/KmKAqx+d1jddNniVrH5cRg2m1g0u43wutgQB3uSeLCjhWwvJ3FVZNkAxlkXj3W0YicCrxxlz8ZxuZFjfdbt+h1d2mn7ZZgzOKchS+VEfqhuVEQ0Vn2QlxTleYwdLNpILIfjQPWCsNsJTBuTNaqrmUhCRCyW8+SLDsLqvGHCRF71qjtx8JVpFdMdw/djAv7pOTGiygzn3gcyco3sO/FgFuV0tMgcwHQxcVIu5+1EcFRnwLnDngin6sBFU3oAk6kMaeqKSfGOuThgaegJVlOtAwk+NMrNCldxTC77h3RElMP+IR0H5dYs+nC5x3WmPJroaK1mHZLkuhhkYpFsjQtV3MnMUTFMAwyrxIt6dY3CIBGPDanh3pbbv/Ynib2peS8fJZRluS3CPNiFgY/4RC06OeEuGWbr4WJZuGr4HHQtv+OqQPCGKUYfCC8Qb3mKhwq+LwSxH+xAqG41U8zczC+aCtiUS7iDMe4dSjmYVNxGzPDVN7UwvVsnHOqJRgOctc+EM+1Q48td76dcDOd9fAlDmMPZ0q9C2y5A5oM130NRT1oruWt39zm2iKThcNgJDX3AUHVRnQx/6nfKpkAi/z4qoWCxbqVq/UZhZqfo8aElDwwbDU/t49bjD51Doq7dAOL4IpK+xUFWdXGQzLpJHwebAojHYtgmhNj4hs0OVdMaNsr/3KsCl6SAYmObSF1yaaOAi3afZ/khUgaBlv4dvN4BpntTiK9Q8ebMaAhrPaE91g1VCTaxzyqrZkkuq7Un46/NVkEmDQYl04c2LF1yxVuMqicuLPGofM9mBGZHN5Nlg5XA7QQlA4hOa+ssFT26qZM/ijUKSFhPQK/+IEUK5bFJKpROGGUk5dwYBfwMvQbVvIXQO8IMLuMXmS/5JffTwAw3Roqx1smPVCjx9R8GXaqr8w8DWtLnCqbB1REsLg8BV6MuMDvhatolJuvM0SuuNHMmzpGExgeb+C3gQ3c/8CHjo3GN9oiPiumTg3IHM0gCP28JX0SGgaZTHbDQH/5Uz5eIplW0z9vhQHEaczU5eqYyW3awORjT1e7JfwOmS7xdL87wLZouux38QzNdR3U8dEiom8rkHdOBkdRH22vfSRhptJS7i5PUFbmOH0SGHvOSynXvVxwCoI5wID1MXE4xpPYAT9l7LaNgk/Sm9oitF92Ofrf9qIHgSLmEk/zQCUPu6I9qEzXvcch39MccWK/opyRqTrhnHzig1a9TkN5AAt+x1jFc42RWPStxPl8/Jwgalat56+YkeZBPzAbvnivmgs8nZyJpnYeNeCC6lrhyIoO8VowDbX2qqjS1GNFnfaPE7SEyyNsTJ/yrXFx9nP8OVyGXQ1Rj5W1iVBtxYi2si0gX1ZSXl+8Y1EMeuAsrIjOIaiqPlY2qkniiCGuV5BUxwF0Wp2VGevsXz4s8q1i/VW6PvKZLz47guiwBJ6JcQibqjB7whXFybPX0cTpXL50sVkB1kG9Ykco28FkUFZqZIuIwl6uOSBPVg08cDVol2nQUtEyUTdy6dsMEX/dhw4FB7WY121SqssPibLpmG9lkxRKBY0ORV8TLbp/dsxEJGwLLs8HlEFX+S/k8oa4yenrK1UQnC+12lYOriJiSaeYwvKP/jCismtVoQgSoCbp6Flc+EifLws1UtVFVLFE+B7u0oMVlKkp5GJhMhIaBY0M0kqfJmfCWGJHUt6jKtaVePvwSVLbLRvAuZXvaxiuCamSCMI3DGauTcaNDS41I6ltcSqyojgD6xcpIjRfGKQhar49noJogWfWUbeDSFKIQrmcaKkRKL4JQudNLZGLsgc81S7mmaZooyaURGb80awiSST2jp3Lf1oJH4OXdTwMmQo7UPVkgCTNXZtHWJ98OOkEhCtnqiaTS5/gjdqQ1kQbvcUs1hFuQlS0gvh6yEGTjioF7aG8jy/hCELkoCoWg9WXsUQjiRV8tBDaxTyGI/fDU8jDw3euveTJK3P4ES43IMIzADJCjci0bAj1TCUXsEqWWjYEb1fAoEs9pxRmGEZgBikaZ4k8lFCMvE4F87L1TehOVdrOupKXINbTQ5P2vgwvGQJ1weiFKj/wFcjNzD+hvZqM41ieo0AnGAtlfJ9acSTdpZ4tqd7X+gH7mSQq2lciz8uvZ4rGI8Q1m1a9LmAXblsQZohlDnzoDb/Jcx5tkfybPcLTPwlygdgtzsAY5WKZ5sAF+/lDdWxjE2/nsR3wP5vn8KnqG6+v4vsh3RY6aDKNn+lQSH+mr6j9bcDyf3Ve7Qn00AbEZ4Evf7uPviyBcN3x/EVzzJiGBfQXqW/awLnN82972vaF0l7DnVTJCtfgaF4cnGO1CRCy7j1cAv6FnzxtC8A3cAv8dfX8N1rj3yIjoFUGL/ewyAPh2yaym0ZZHPxGG19Hbn/8ffJoSGCJkAQA= - - - dbo - - \ No newline at end of file diff --git a/Step.Database/Migrations/201810231526097_InitMigration.Designer.cs b/Step.Database/Migrations/201810240848483_InitMigration.Designer.cs similarity index 92% rename from Step.Database/Migrations/201810231526097_InitMigration.Designer.cs rename to Step.Database/Migrations/201810240848483_InitMigration.Designer.cs index b588da35..2f4b482d 100644 --- a/Step.Database/Migrations/201810231526097_InitMigration.Designer.cs +++ b/Step.Database/Migrations/201810240848483_InitMigration.Designer.cs @@ -13,7 +13,7 @@ namespace Step.Database.Migrations string IMigrationMetadata.Id { - get { return "201810231526097_InitMigration"; } + get { return "201810240848483_InitMigration"; } } string IMigrationMetadata.Source diff --git a/Step.Database/Migrations/201810231526097_InitMigration.cs b/Step.Database/Migrations/201810240848483_InitMigration.cs similarity index 94% rename from Step.Database/Migrations/201810231526097_InitMigration.cs rename to Step.Database/Migrations/201810240848483_InitMigration.cs index 2b2eed3c..a1dea918 100644 --- a/Step.Database/Migrations/201810231526097_InitMigration.cs +++ b/Step.Database/Migrations/201810240848483_InitMigration.cs @@ -16,6 +16,36 @@ namespace Step.Database.Migrations }) .PrimaryKey(t => t.id); + CreateTable( + "dbo.alarm_file", + c => new + { + id = c.Int(nullable: false, identity: true), + file_name = c.String(unicode: false), + local_file_name = c.String(unicode: false), + alarm_desc_id = c.Int(nullable: false), + user_id = c.Int(), + }) + .PrimaryKey(t => t.id) + .ForeignKey("dbo.alarm_description", t => t.alarm_desc_id, cascadeDelete: true) + .ForeignKey("dbo.user", t => t.user_id) + .Index(t => t.alarm_desc_id) + .Index(t => t.user_id); + + CreateTable( + "dbo.user", + c => new + { + id = c.Int(nullable: false, identity: true), + username = c.String(nullable: false, unicode: false), + first_name = c.String(unicode: false), + last_name = c.String(unicode: false), + password = c.String(unicode: false), + security_stamp = c.String(unicode: false), + language = c.String(unicode: false), + }) + .PrimaryKey(t => t.id); + CreateTable( "dbo.alarm_occurrence", c => new @@ -44,20 +74,6 @@ namespace Step.Database.Migrations .Index(t => t.user_id) .Index(t => t.alarm_occurence_id); - CreateTable( - "dbo.user", - c => new - { - id = c.Int(nullable: false, identity: true), - username = c.String(nullable: false, unicode: false), - first_name = c.String(unicode: false), - last_name = c.String(unicode: false), - password = c.String(unicode: false), - security_stamp = c.String(unicode: false), - language = c.String(unicode: false), - }) - .PrimaryKey(t => t.id); - CreateTable( "dbo.alarm_note", c => new @@ -323,6 +339,8 @@ namespace Step.Database.Migrations DropForeignKey("dbo.alarm_user", "user_id", "dbo.user"); DropForeignKey("dbo.alarm_user", "alarm_occurence_id", "dbo.alarm_occurrence"); DropForeignKey("dbo.alarm_occurrence", "alarm_id", "dbo.alarm_description"); + DropForeignKey("dbo.alarm_file", "user_id", "dbo.user"); + DropForeignKey("dbo.alarm_file", "alarm_desc_id", "dbo.alarm_description"); DropIndex("dbo.session", new[] { "machine_user_id" }); DropIndex("dbo.performed_maintenance", new[] { "maintainers_id" }); DropIndex("dbo.performed_maintenance", new[] { "maintenance" }); @@ -341,6 +359,8 @@ namespace Step.Database.Migrations DropIndex("dbo.alarm_user", new[] { "alarm_occurence_id" }); DropIndex("dbo.alarm_user", new[] { "user_id" }); DropIndex("dbo.alarm_occurrence", new[] { "alarm_id" }); + DropIndex("dbo.alarm_file", new[] { "user_id" }); + DropIndex("dbo.alarm_file", new[] { "alarm_desc_id" }); DropTable("dbo.session"); DropTable("dbo.queue"); DropTable("dbo.performed_maintenance"); @@ -357,9 +377,10 @@ namespace Step.Database.Migrations DropTable("dbo.tool"); DropTable("dbo.family"); DropTable("dbo.alarm_note"); - DropTable("dbo.user"); DropTable("dbo.alarm_user"); DropTable("dbo.alarm_occurrence"); + DropTable("dbo.user"); + DropTable("dbo.alarm_file"); DropTable("dbo.alarm_description"); } } diff --git a/Step.Database/Migrations/201810240848483_InitMigration.resx b/Step.Database/Migrations/201810240848483_InitMigration.resx new file mode 100644 index 00000000..a9ea712c --- /dev/null +++ b/Step.Database/Migrations/201810240848483_InitMigration.resx @@ -0,0 +1,126 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + 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 + + + dbo + + \ No newline at end of file diff --git a/Step.Database/Step.Database.csproj b/Step.Database/Step.Database.csproj index c124a8bb..f928b102 100644 --- a/Step.Database/Step.Database.csproj +++ b/Step.Database/Step.Database.csproj @@ -81,9 +81,9 @@ - - - 201810231526097_InitMigration.cs + + + 201810240848483_InitMigration.cs @@ -119,8 +119,8 @@ - - 201810231526097_InitMigration.cs + + 201810240848483_InitMigration.cs diff --git a/Step.Model/Constants.cs b/Step.Model/Constants.cs index 0a703c9f..ceba6b5c 100644 --- a/Step.Model/Constants.cs +++ b/Step.Model/Constants.cs @@ -214,7 +214,8 @@ namespace Step.Model } // File paths - public const string MAINTENANCE_ATTACHMENT_PATH = @"C:\CMS\STEP\attachment\"; + public const string MAINTENANCE_ATTACHMENT_PATH = @"C:\CMS\STEP\attachment\maintenance\"; + public const string ALARM_ATTACHMENT_PATH = @"C:\CMS\STEP\attachment\alarm\"; public const string TEMP_FOLDER = @"C:\CMS\STEP\TMP\"; public const string TEMP_PP_FOLDER = TEMP_FOLDER + @"pp\"; public const string JOB_TMP_DIRECTORY = TEMP_PP_FOLDER + @"job\"; diff --git a/Step.Model/DatabaseModels/AlarmFileModel.cs b/Step.Model/DatabaseModels/AlarmFileModel.cs new file mode 100644 index 00000000..5bf04376 --- /dev/null +++ b/Step.Model/DatabaseModels/AlarmFileModel.cs @@ -0,0 +1,36 @@ +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("alarm_file")] + public class AlarmFileModel + { + [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("alarm_desc_id")] + public int AlarmDescriptionId { get; set; } + + [ForeignKey("AlarmDescriptionId")] + public virtual AlarmDescriptionsModel AlarmDescription { get; set; } + + [Column("user_id")] + public int? UserId { get; set; } + + [ForeignKey("UserId")] + public UserModel User { get; set; } + } +} diff --git a/Step.Model/DatabaseModels/NcFamilyModel.cs b/Step.Model/DatabaseModels/NcFamilyModel.cs index 8e1ed9a5..c13c9330 100644 --- a/Step.Model/DatabaseModels/NcFamilyModel.cs +++ b/Step.Model/DatabaseModels/NcFamilyModel.cs @@ -23,7 +23,7 @@ namespace Step.Model.DatabaseModels public byte RightSize { get; set; } [Column("left_size")] - public byte LeftSize { get; set; } + public byte LeftSize { get; set; } [Column("tcp_table")] public byte TcpTable { get; set; } diff --git a/Step.Model/Step.Model.csproj b/Step.Model/Step.Model.csproj index d6fe7772..ebe40577 100644 --- a/Step.Model/Step.Model.csproj +++ b/Step.Model/Step.Model.csproj @@ -71,6 +71,7 @@ + diff --git a/Step/App_Start/Startup.cs b/Step/App_Start/Startup.cs index c899b894..e0c9e94d 100644 --- a/Step/App_Start/Startup.cs +++ b/Step/App_Start/Startup.cs @@ -143,6 +143,8 @@ namespace Step.App_Start { if (!Directory.Exists(MAINTENANCE_ATTACHMENT_PATH)) Directory.CreateDirectory(MAINTENANCE_ATTACHMENT_PATH); + if (!Directory.Exists(ALARM_ATTACHMENT_PATH)) + Directory.CreateDirectory(ALARM_ATTACHMENT_PATH); if (!Directory.Exists(TEMP_PP_FOLDER)) Directory.CreateDirectory(TEMP_PP_FOLDER); diff --git a/Step/Controllers/WebApi/ApiAlarmController.cs b/Step/Controllers/WebApi/ApiAlarmController.cs index 3ab6130c..a5e8620b 100644 --- a/Step/Controllers/WebApi/ApiAlarmController.cs +++ b/Step/Controllers/WebApi/ApiAlarmController.cs @@ -1,17 +1,21 @@ using Step.Database.Controllers; +using Step.Model.DatabaseModels; +using Step.Model.DTOModels.AlarmModels; +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; -using System.Linq; -using Step.Model.DTOModels.MaintenanceModels; -using Step.Model.DTOModels.AlarmModels; -using Step.Model.DatabaseModels; namespace Step.Controllers.WebApi -{ - [RoutePrefix("api/alarm")] +{ + [RoutePrefix("api/alarm")] public class ApiAlarmController : ApiController { [Route(""), HttpGet] @@ -20,9 +24,9 @@ namespace Step.Controllers.WebApi using (AlarmsController alarm = new AlarmsController()) { var a = alarm.GetPaginated(page, pageSize); - + return Ok(a); - } + } } [Route("paginated"), HttpPost] @@ -47,7 +51,28 @@ namespace Step.Controllers.WebApi } } - // Note + #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)] @@ -62,9 +87,9 @@ namespace Step.Controllers.WebApi using (AlarmsController alarmsController = new AlarmsController()) { - // Check if maintenance id - AlarmDescriptionsModel dbMaint = alarmsController.FindById(alarmDescId); - if (dbMaint == null) + // Check if alarm desc exists + AlarmDescriptionsModel dbAlarm = alarmsController.FindById(alarmDescId); + if (dbAlarm == null) return NotFound(); // Update data @@ -87,7 +112,7 @@ namespace Step.Controllers.WebApi using (AlarmsController alarmsController = new AlarmsController()) { - // Check if maintenance id + // Check if alarm desc exists AlarmNoteModel dbNote = alarmsController.FindNoteById(noteId); if (dbNote == null) return NotFound(); @@ -116,7 +141,7 @@ namespace Step.Controllers.WebApi using (AlarmsController alarmsController = new AlarmsController()) { - // Check if maintenance id + // Check if alarm desc exists AlarmNoteModel dbNote = alarmsController.FindNoteById(noteId); if (dbNote == null) return NotFound(); @@ -131,5 +156,111 @@ namespace Step.Controllers.WebApi 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 } } \ No newline at end of file diff --git a/Step/Controllers/WebApi/ApiMaintenanceController.cs b/Step/Controllers/WebApi/ApiMaintenanceController.cs index 072b8d87..e9a65e96 100644 --- a/Step/Controllers/WebApi/ApiMaintenanceController.cs +++ b/Step/Controllers/WebApi/ApiMaintenanceController.cs @@ -4,6 +4,7 @@ using Step.Database.Controllers; using Step.Model.DatabaseModels; using Step.Model.DTOModels.MaintenanceModels; using Step.NC; +using Step.Provider; using System; using System.Collections.Generic; using System.ComponentModel.DataAnnotations; @@ -36,7 +37,7 @@ namespace Step.Controllers.WebApi using (NcHandler ncHandler = new NcHandler()) { ncHandler.Connect(); - // Get list of maintenances with user's permission + // Get list of maintenances with user's permission CmsError cmsError = ncHandler.GetMaintenancesWithPermissions(out List maintenances, Convert.ToInt32(userId.Value)); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); @@ -66,7 +67,7 @@ namespace Step.Controllers.WebApi CmsError cmsError = ncHandler.GetMaintenanceDataById(dbMaint.MaintenanceId, Convert.ToInt32(userId.Value), out DTOMaintenanceModel maintenance); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); - + return Ok(maintenance); } } @@ -90,7 +91,7 @@ namespace Step.Controllers.WebApi if (dbMaint == null) return NotFound(); - // Check if is created by CMS + // Check if is created by CMS if (dbMaint.UserId == null) return Unauthorized(); @@ -151,6 +152,42 @@ namespace Step.Controllers.WebApi } } + [Route("maintenance/{maintenanceId:int}/performe"), HttpPost] + [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.MAINTENANCE, Action = ACTIONS.WRITE)] + public IHttpActionResult PerformeMaintenance(int maintenanceId) + { + 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(); + + // Update data + using (NcHandler ncHandler = new NcHandler()) + { + ncHandler.Connect(); + CmsError cmsError = ncHandler.GetMaintenanceDataById(maintenanceId, Convert.ToInt32(userId.Value), out DTOMaintenanceModel maintData); + if (cmsError.IsError()) + return BadRequest(cmsError.localizationKey); + + if (!maintData.CanPerform) + return Unauthorized(); + + using (MaintenancesController maintenancesController = new MaintenancesController()) + { + // Check if maintenance id + PerformedMaintenanceModel performed = maintenancesController.PerformeMaintenance(maintData.PlcCounter, maintenanceId, Convert.ToInt32(userId.Value)); + if (performed == null) + return NotFound(); + maintData.LastPerformedDate = performed.Date; + return Ok(maintData); + } + } + } + + #region Note + [Route("maintenance/{maintenanceId:int}/note"), HttpGet] [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.MAINTENANCE, Action = ACTIONS.READ)] public IHttpActionResult GetMaintenanceNotes(int maintenanceId) @@ -254,46 +291,13 @@ namespace Step.Controllers.WebApi return Ok(); } } - - [Route("maintenance/{maintenanceId:int}/performe"), HttpPost] + #endregion Note - [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.MAINTENANCE, Action = ACTIONS.WRITE)] - public IHttpActionResult PerformeMaintenance(int maintenanceId) - { - 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(); - - // Update data - using (NcHandler ncHandler = new NcHandler()) - { - ncHandler.Connect(); - CmsError cmsError = ncHandler.GetMaintenanceDataById(maintenanceId, Convert.ToInt32(userId.Value), out DTOMaintenanceModel maintData); - if (cmsError.IsError()) - return BadRequest(cmsError.localizationKey); - - if (!maintData.CanPerform) - return Unauthorized(); - - using (MaintenancesController maintenancesController = new MaintenancesController()) - { - // Check if maintenance id - PerformedMaintenanceModel performed = maintenancesController.PerformeMaintenance(maintData.PlcCounter, maintenanceId, Convert.ToInt32(userId.Value)); - if (performed == null) - return NotFound(); - maintData.LastPerformedDate = performed.Date; - return Ok(maintData); - } - } - } + #region Attachment [Route("maintenance/{maintenanceId:int}/attachments"), HttpGet] [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.MAINTENANCE, Action = ACTIONS.READ)] - public IHttpActionResult GetAttachments(int maintenanceId) { using (MaintenancesController maintenancesController = new MaintenancesController()) @@ -358,7 +362,6 @@ namespace Step.Controllers.WebApi [Route("attachment/{attachmentId:int}"), HttpDelete] [WebApiAuthorize(FunctionAccess = FUNCTIONALITY_NAMES.MAINTENANCE, Action = ACTIONS.WRITE)] - public IHttpActionResult DeleteAttachment(int attachmentId) { var identity = User.Identity as ClaimsIdentity; @@ -381,56 +384,9 @@ namespace Step.Controllers.WebApi return Ok(); } } + + #endregion Attachment + } - 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("inline") - { - 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 diff --git a/Step/Provider/CustomMultipartFormDataStreamProvider.cs b/Step/Provider/CustomMultipartFormDataStreamProvider.cs new file mode 100644 index 00000000..86b1fd8c --- /dev/null +++ b/Step/Provider/CustomMultipartFormDataStreamProvider.cs @@ -0,0 +1,63 @@ +using System; +using System.IO; +using System.Net; +using System.Net.Http; +using System.Net.Http.Headers; +using System.Threading; +using System.Threading.Tasks; +using System.Web; +using System.Web.Http; + +namespace Step.Provider +{ + 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("inline") + { + 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 diff --git a/Step/Step.csproj b/Step/Step.csproj index 1589b788..07a83fc4 100644 --- a/Step/Step.csproj +++ b/Step/Step.csproj @@ -189,6 +189,7 @@ +