using CMS_CORE_Library.Models; using Step.Model.DTOModels; using Step.NC; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Threading.Tasks; using System.Web.Http; using static CMS_CORE_Library.Models.DataStructures; using static Step.Config.ServerConfig; using static Step.Model.Constants; namespace Step.Controllers.WebApi { [RoutePrefix("api/file_manager")] public class NcFileController : ApiController { [Route("files"), HttpGet] public IHttpActionResult GetFileList(string filePath = "") { using (NcFileAdapter ncAdapter = new NcFileAdapter()) { ncAdapter.Connect(); CmsError cmsError = ncAdapter.GetFileList(filePath, out List fileList); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); return Ok(fileList); } } [Route("file/info"), HttpGet] public IHttpActionResult GetFileInfo([FromUri]string filePath) { using (NcFileAdapter ncAdapter = new NcFileAdapter()) { ncAdapter.Connect(); CmsError cmsError = ncAdapter.GetFileInfo(filePath, out InfoFile fileInfo); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); return Ok(fileInfo); } } [Route("file/active/info"), HttpGet] public IHttpActionResult GetActiveFileInfo([FromUri]string filePath) { using (NcFileAdapter ncAdapter = new NcFileAdapter()) { ncAdapter.Connect(); CmsError cmsError = ncAdapter.GetActiveFileInfo(filePath, out DTOActiveImageAndNameDataModel fileInfo); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); return Ok(fileInfo); } } [Route("file/active"), HttpPut] public IHttpActionResult SetActiveProgram([FromUri]string filePath) { using (NcFileAdapter ncAdapter = new NcFileAdapter()) { ncAdapter.Connect(); CmsError cmsError = ncAdapter.SetActiveProgramInfo(filePath, out DTOActiveProgramDataModel fileInfo); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); return Ok(fileInfo); } } [Route("file/deactivate"), HttpPut] public IHttpActionResult DeactivateProgram() { using (NcFileAdapter ncAdapter = new NcFileAdapter()) { ncAdapter.Connect(); CmsError cmsError = ncAdapter.DeactivateProgram(out DTOActiveProgramDataModel fileInfo); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); return Ok(fileInfo); } } [Route("upload"), HttpPost] public async Task UpdloadProgramWithImage() { bool imageUploaded = false; string mainPPName = ""; List programs = new List(); if (!Request.Content.IsMimeMultipartContent()) { throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } List formItems = await MultipartHandler.ManageMultiPartFileAsync(Request); using (NcFileAdapter ncFileHandler = new NcFileAdapter()) { ncFileHandler.Connect(); if (NcConfig.NcVendor == NC_VENDOR.OSAI) { // Clean upload folder only OSAI CmsError cmsError = ncFileHandler.CleanUploadFolder(); if (cmsError.IsError() && cmsError.errorCode != CMS_ERROR_CODES.FILE_NOT_FOUND) return BadRequest(cmsError.localizationKey); } ActiveProgramDataModel programData = new ActiveProgramDataModel(); foreach (FormItem item in formItems) { if (item.IsAFile) { if (item.ParameterName == "main") { File.WriteAllBytes(TEMP_PP_FOLDER + item.FileName, item.Data); programs.Add(item.FileName); // Upload main program CmsError cmsError = ncFileHandler.UploadPartProgramAndActivate(TEMP_PP_FOLDER, item.FileName, out programData); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); mainPPName = Path.GetFileNameWithoutExtension(programData.Path); } else if (item.ParameterName == "file") { File.WriteAllBytes(TEMP_PP_FOLDER + item.FileName, item.Data); programs.Add(item.FileName); // Upload files CmsError cmsError = ncFileHandler.UploadPartProgram(TEMP_PP_FOLDER, item.FileName, out string programPath); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); } else if (item.ParameterName == "image") { // Delete duplicated images string[] imgFiles = Directory.GetFiles(PART_PRG_IMAGES); foreach (string f in imgFiles) { if (Path.GetFileNameWithoutExtension(f) == mainPPName) File.Delete(f); } // Upload image File.WriteAllBytes( PART_PRG_IMAGES + // Path mainPPName + // Part program name Path.GetExtension(item.FileName), // Extension of the image item.Data); imageUploaded = true; } } } if (!imageUploaded) { // Delete old images with the same name of the main program string[] imgFiles = Directory.GetFiles(PART_PRG_IMAGES); foreach (string f in imgFiles) { if (Path.GetFileNameWithoutExtension(f) == mainPPName) File.Delete(f); } } if (NcConfig.NcVendor != NC_VENDOR.OSAI) { List lines = new List(); string outputFileName = NcConfig.SharedPath + PARTPRG_LIST_FILE; foreach (string prog in programs) { FileInfo fi = new FileInfo(NcConfig.SharedPath + prog); if (fi.Exists) { lines.Add(prog + "|" + fi.CreationTime + "|" + fi.LastWriteTime); } } // Write file File.WriteAllLines(outputFileName, lines.ToArray()); } } return Ok(); } [Route("shared_folder_ok"), HttpGet] public IHttpActionResult IsSharedFolderOK() { if (NcConfig.NcVendor == NC_VENDOR.OSAI) return Ok(true); else { if (!File.Exists(NcConfig.SharedPath)) return Ok(true); string fileName = NcConfig.SharedPath + PARTPRG_LIST_FILE; int count = Directory.GetFiles(NcConfig.SharedPath) != null ? Directory.GetFiles(NcConfig.SharedPath).Length : 0; if (!File.Exists(fileName) && count == 0) return Ok(true); if (File.Exists(fileName) && count == 1) return Ok(false); if (File.Exists(fileName) && count > 1) { // Write file string[] lines = File.ReadAllLines(fileName); foreach (string line in lines) { if (!string.IsNullOrWhiteSpace(line)) { string[] linesplitted = line.Split('|'); if (linesplitted.Length != 3) return Ok(false); FileInfo fi = new FileInfo(NcConfig.SharedPath + linesplitted[0]); if (!fi.Exists) return Ok(false); if (fi.CreationTime.ToString() != linesplitted[1]) return Ok(false); if (fi.LastWriteTime.ToString() != linesplitted[2]) return Ok(false); } } return Ok(true); } return Ok(false); } } [Route("clean_shared_folder"), HttpPut] public IHttpActionResult cleanSharedFolder() { if (NcConfig.NcVendor == NC_VENDOR.OSAI) return Ok(true); else { foreach(string filename in Directory.GetFiles(NcConfig.SharedPath)) { File.Delete(filename); } } return Ok(false); } [Route("backup_shared_folder"), HttpPut] public IHttpActionResult BackupSharedFolder() { if (NcConfig.NcVendor == NC_VENDOR.OSAI) return Ok(true); else { string newFolder = "C:\\Backup_" + new DirectoryInfo(NcConfig.SharedPath).Name + "\\" + DateTime.Now.ToString("dd-MM-yyyy_HH-mm-ss") + "\\"; File.Delete(NcConfig.SharedPath + PARTPRG_LIST_FILE); Directory.CreateDirectory(newFolder); foreach (string filename in Directory.GetFiles(NcConfig.SharedPath)) { File.Move(filename, newFolder + Path.GetFileName(filename)); } return Ok(true); } } [Route("shared_files"), HttpGet] public IHttpActionResult GetSharedFolderFileList(string sharedPath) { List filelist = new List(); // NC - PC shared folder path string sharedFullPath = NcConfig.SharedPath + sharedPath; if (!Directory.Exists(sharedFullPath)) return NotFound(); // Create list of directories foreach (string item in Directory.GetDirectories(sharedFullPath)) { filelist.Add(new { Name = Path.GetFileName(item), AbsolutePath = NcConfig.SharedPath + sharedPath, Path = sharedPath, IsDirectory = true }); } string sharedNcPath = NcConfig.SharedName + sharedPath.Replace('\\', '/'); // Add files to list foreach (string item in Directory.GetFiles(sharedFullPath)) { if (VALID_FILE_EXTENSIONS.Contains(Path.GetExtension(item).ToLower())) filelist.Add(new { Name = Path.GetFileName(item), AbsolutePath = sharedNcPath + "/" + Path.GetFileName(item), Path = sharedPath + "\\" + Path.GetFileName(item), IsDirectory = false }); } return Ok(filelist); } #region Queue Manager [Route("queue/add"), HttpPost] public async Task UploadToQueue() { if (!Request.Content.IsMimeMultipartContent()) { throw new HttpResponseException(HttpStatusCode.UnsupportedMediaType); } List formItems = await MultipartHandler.ManageMultiPartFileAsync(Request); DTOQueueModel queueItem = new DTOQueueModel(); foreach (FormItem item in formItems) { if (item.IsAFile) { // Get part program under "file" key if (item.ParameterName == "file") { using (NcFileAdapter ncAdapter = new NcFileAdapter()) { ncAdapter.Connect(); File.WriteAllBytes(QUEUE_TMP_FOLDER + item.FileName, item.Data); // Get reps var repsParam = formItems.Where(x => x.ParameterName == "reps").FirstOrDefault(); // Check if reps parameter is null or isn't a valid int if (repsParam == null || !int.TryParse(repsParam.Value, out int reps)) return BadRequest(); // Upload CmsError cmsError = ncAdapter.UploadPartProgramAndAddToQueue(QUEUE_TMP_FOLDER, item.FileName, reps, out queueItem); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); } } else if (item.ParameterName == "image") { File.WriteAllBytes(PART_PRG_IMAGES + item.FileName, item.Data); } } } return Ok(queueItem); } [Route("queue/{processId:int}/remove/{itemId:int}"), HttpDelete] public IHttpActionResult RemoveFromQueue(int processId, int itemId) { using (NcFileAdapter ncAdapter = new NcFileAdapter()) { ncAdapter.Connect(); CmsError cmsError = ncAdapter.RemoveFromQueue(processId, itemId); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); } return Ok(); } [Route("queue/{processId:int}/move"), HttpPut] public IHttpActionResult MoveQueueItems(int processId, MoveItems itemsPositions) { using (NcFileAdapter ncAdapter = new NcFileAdapter()) { CmsError cmsError = ncAdapter.MoveQueueItems(processId, itemsPositions.ObjectId, itemsPositions.NewPosition, out List queue); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); return Ok(queue); } } [Route("queue/{processId:int}/edit/{itemId:int}"), HttpPut] public IHttpActionResult EditQueueItem(int processId, int itemId, RepsModel reps) { using (NcFileAdapter ncAdapter = new NcFileAdapter()) { if (reps.Reps < 1) return BadRequest(INCORRECT_PARAMETERS_ERROR.localizationKey); CmsError cmsError = ncAdapter.EditQueueItemReps(processId, itemId, reps.Reps, out DTOQueueModel queueItem); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); return Ok(queueItem); } } [Route("queue/{processId:int}/empty"), HttpDelete] public IHttpActionResult EmptyQueue(int processId) { using (NcFileAdapter ncAdapter = new NcFileAdapter()) { CmsError cmsError = ncAdapter.EmptyQueue(processId); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); return Ok(); } } [Route("queue/start")] public IHttpActionResult StartWorkingQueue(int processId) { using (NcFileAdapter ncAdapter = new NcFileAdapter()) { ncAdapter.Connect(); CmsError cmsError = ncAdapter.StartWorkingQueue(processId); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); return Ok(); } } [Route("queue/stop")] public IHttpActionResult StopWorkingQueue(int processId) { using (NcFileAdapter ncAdapter = new NcFileAdapter()) { ncAdapter.Connect(); CmsError cmsError = ncAdapter.StopWorkingQueue(processId); if (cmsError.IsError()) return BadRequest(cmsError.localizationKey); return Ok(); } } [Route("macros")] public IHttpActionResult GetMacros() { return Ok(MacrosConfig); } public class MoveItems { public int ObjectId; public int NewPosition; } public class RepsModel { public int Reps; } #endregion Queue Manager } }