public async Task <HttpResponseMessage> UploadResponseOutput() { if (!Request.Content.IsMimeMultipartContent()) { return(Request.CreateErrorResponse(HttpStatusCode.UnsupportedMediaType, "Content must be mime multipart.")); } Guid responseID = Guid.Empty; Guid documentID = Guid.Empty; Guid revisionSetID = Guid.Empty; Guid uploadedByID = Guid.Empty; Stream stream = null; string documentName = string.Empty; string description = string.Empty; string filename = string.Empty; Guid? parentDocumentID = null; string documentKind = null; var provider = new MultipartMemoryStreamProvider(); var o = await Request.Content.ReadAsMultipartAsync(provider); foreach (var c in o.Contents) { string parameterName = c.Headers.ContentDisposition.Name.Replace("\"", ""); switch (parameterName) { case "responseID": Guid.TryParse(await c.ReadAsStringAsync(), out responseID); break; case "id": Guid.TryParse(await c.ReadAsStringAsync(), out documentID); break; case "revisionSetID": Guid.TryParse(await c.ReadAsStringAsync(), out revisionSetID); break; case "files": //filename = Path.GetFileName(c.Headers.ContentDisposition.FileName.Replace("\"", "")); stream = await c.ReadAsStreamAsync(); break; case "parentDocumentID": Guid parentID; if (Guid.TryParse(await c.ReadAsStringAsync(), out parentID)) { parentDocumentID = parentID; } break; case "description": description = await c.ReadAsStringAsync(); break; case "documentName": documentName = await c.ReadAsStringAsync(); break; case "uploadedByID": Guid.TryParse(await c.ReadAsStringAsync(), out uploadedByID); break; case "kind": documentKind = await c.ReadAsStringAsync(); break; } } if (responseID == Guid.Empty || !(await DataContext.Responses.AnyAsync(rsp => rsp.ID == responseID))) { throw new HttpResponseException(Request.CreateErrorResponse(HttpStatusCode.NotFound, "Unable to determine the response to associate the document to.")); } if (string.IsNullOrEmpty(filename) && string.IsNullOrEmpty(documentName)) { return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Filename is missing.")); } Document document = new Document { ID = documentID, ItemID = responseID, Name = string.IsNullOrEmpty(documentName) ? filename : documentName, FileName = string.IsNullOrEmpty(documentName) ? filename : documentName, MimeType = string.IsNullOrEmpty(documentName) ? Lpp.Utilities.FileEx.GetMimeTypeByExtension(filename) : Lpp.Utilities.FileEx.GetMimeTypeByExtension(documentName), Length = stream.Length, Description = description, ParentDocumentID = parentDocumentID, UploadedByID = uploadedByID, Kind = documentKind }; if (document.ParentDocumentID.HasValue) { var versionQuery = from d in DataContext.Documents let revisionID = DataContext.Documents.Where(p => p.ID == parentDocumentID).Select(p => p.RevisionSetID).FirstOrDefault() where d.RevisionSetID == revisionID && d.ItemID == responseID orderby d.MajorVersion descending, d.MinorVersion descending, d.BuildVersion descending, d.RevisionVersion descending select new { d.ItemID, d.RevisionSetID, d.MajorVersion, d.MinorVersion, d.BuildVersion, d.RevisionVersion }; var version = await versionQuery.FirstOrDefaultAsync(); if (version != null) { document.RevisionSetID = version.RevisionSetID; document.MajorVersion = version.MajorVersion; document.MinorVersion = version.MinorVersion; document.BuildVersion = version.BuildVersion; document.RevisionVersion = version.RevisionVersion + 1; } } if (!document.RevisionSetID.HasValue) { document.RevisionSetID = document.ID; } DataContext.Documents.Add(document); if ((await DataContext.RequestDataMarts.Where(rdm => rdm.Responses.Any(rsp => rsp.ID == responseID)).Select(rdm => rdm.Request.WorkFlowActivityID).FirstOrDefaultAsync()).HasValue) { DataContext.RequestDocuments.Add(new RequestDocument { ResponseID = responseID, RevisionSetID = document.RevisionSetID.Value, DocumentType = DTO.Enums.RequestDocumentType.Output }); } await DataContext.SaveChangesAsync(); using (var dbStream = new Dns.Data.Documents.DocumentStream(DataContext, document.ID)) { await stream.CopyToAsync(dbStream); } return(Request.CreateResponse(HttpStatusCode.OK)); }
public async Task <HttpResponseMessage> Upload() { if (!Request.Content.IsMimeMultipartContent()) { return(Request.CreateErrorResponse(HttpStatusCode.UnsupportedMediaType, "Content must be mime multipart.")); } Guid taskID = Guid.Empty; Guid requestID = Guid.Empty; string documentName = string.Empty; string description = string.Empty; string filename = string.Empty; string comments = string.Empty; Guid? parentDocumentID = null; DTO.Enums.TaskItemTypes?taskItemType = null; Guid responseID = Guid.Empty; string documentKind = string.Empty; string uploadPath = System.Web.HttpContext.Current.Server.MapPath("~/App_Data/Uploads/"); if (!Directory.Exists(uploadPath)) { Directory.CreateDirectory(uploadPath); } var provider = new MultipartFormDataStreamProvider(uploadPath); var o = await Request.Content.ReadAsMultipartAsync(provider); foreach (var c in o.Contents) { string parameterName = c.Headers.ContentDisposition.Name.Replace("\"", ""); switch (parameterName) { case "requestID": Guid.TryParse(await c.ReadAsStringAsync(), out requestID); break; case "taskID": Guid.TryParse(await c.ReadAsStringAsync(), out taskID); break; case "taskItemType": DTO.Enums.TaskItemTypes itemType; if (Enum.TryParse <DTO.Enums.TaskItemTypes>(await c.ReadAsStringAsync(), out itemType)) { taskItemType = itemType; } break; case "comments": comments = await c.ReadAsStringAsync(); break; case "files": filename = Path.GetFileName(c.Headers.ContentDisposition.FileName.Replace("\"", "")); break; case "parentDocumentID": Guid parentID; if (Guid.TryParse(await c.ReadAsStringAsync(), out parentID)) { parentDocumentID = parentID; } break; case "description": description = await c.ReadAsStringAsync(); break; case "documentName": documentName = await c.ReadAsStringAsync(); break; case "responseID": Guid.TryParse(await c.ReadAsStringAsync(), out responseID); break; case "documentKind": documentKind = await c.ReadAsStringAsync(); break; } } if (taskID == Guid.Empty && requestID == Guid.Empty && responseID == Guid.Empty) { return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Unable to determine the documents owning object ID.")); } if (string.IsNullOrEmpty(filename)) { return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Filename is missing.")); } if (requestID == Guid.Empty && taskID != Guid.Empty) { //Get the requestID based on the task. requestID = await DataContext.ActionReferences.Where(tr => tr.TaskID == taskID && tr.Type == DTO.Enums.TaskItemTypes.Request).Select(tr => tr.ItemID).FirstOrDefaultAsync(); } //TODO: check for upload permission var stream = new FileStream(o.FileData.First().LocalFileName, FileMode.Open); var document = new Document { Description = description, Name = string.IsNullOrEmpty(documentName) ? filename : documentName, FileName = filename, MimeType = Lpp.Utilities.FileEx.GetMimeTypeByExtension(filename), ItemID = responseID != Guid.Empty ? responseID : taskID == Guid.Empty ? requestID : taskID, Length = stream.Length, RevisionDescription = comments, UploadedByID = Identity.ID, ParentDocumentID = parentDocumentID }; if (documentKind != string.Empty) { if (documentKind == "OutputManifest") { document.Kind = "DistributedRegression.FileList"; } else if (documentKind == "TrackingTable") { document.Kind = "DistributedRegression.TrackingTable"; } else { document.Kind = null; } } if (document.ParentDocumentID.HasValue) { var versionQuery = from d in DataContext.Documents let revisionID = DataContext.Documents.Where(p => p.ID == parentDocumentID).Select(p => p.RevisionSetID).FirstOrDefault() let taskReference = DataContext.ActionReferences.Where(tr => tr.ItemID == d.ID).DefaultIfEmpty() where d.RevisionSetID == revisionID orderby d.MajorVersion descending, d.MinorVersion descending, d.BuildVersion descending, d.RevisionVersion descending select new { d.ItemID, d.RevisionSetID, d.MajorVersion, d.MinorVersion, d.BuildVersion, d.RevisionVersion, TaskItemType = taskReference.Select(tr => (DTO.Enums.TaskItemTypes?)tr.Type).FirstOrDefault() }; var version = taskID != Guid.Empty ? await versionQuery.Where(d => d.ItemID == taskID).FirstOrDefaultAsync() : await versionQuery.Where(d => d.ItemID == requestID).FirstOrDefaultAsync(); if (version != null) { document.RevisionSetID = version.RevisionSetID; document.MajorVersion = version.MajorVersion; document.MinorVersion = version.MinorVersion; document.BuildVersion = version.BuildVersion; document.RevisionVersion = version.RevisionVersion + 1; //if the task item type has not been specified for the upload but the parent document had it specified, inhertit the type. if (taskItemType == null && version.TaskItemType.HasValue) { taskItemType = version.TaskItemType.Value; } } } if (!document.RevisionSetID.HasValue) { document.RevisionSetID = document.ID; } DataContext.Documents.Add(document); if (responseID != Guid.Empty) { var requestDoc = new RequestDocument { ResponseID = responseID, RevisionSetID = document.ID, DocumentType = DTO.Enums.RequestDocumentType.Output }; DataContext.RequestDocuments.Add(requestDoc); } if (taskItemType.HasValue && taskID != Guid.Empty) { DataContext.ActionReferences.Add(new TaskReference { TaskID = taskID, ItemID = document.ID, Type = taskItemType.Value }); } await DataContext.SaveChangesAsync(); DateTime contentCreatedOn = DateTime.UtcNow; try { using (var dbStream = new Dns.Data.Documents.DocumentStream(DataContext, document.ID)) { await stream.CopyToAsync(dbStream, 50000000); //await dbStream.CopyFromStreamAsync(stream, 50000000); } } finally { stream.Close(); stream.Dispose(); stream = null; System.IO.File.Delete(o.FileData.First().LocalFileName); } await DataContext.Database.ExecuteSqlCommandAsync("UPDATE Documents SET ContentModifiedOn = GETUTCDATE(), ContentCreatedOn = @ContentCreatedOn WHERE ID = @ID", new System.Data.SqlClient.SqlParameter("@ID", document.ID), new System.Data.SqlClient.SqlParameter("@ContentCreatedOn", contentCreatedOn)); if (!string.IsNullOrWhiteSpace(comments)) { //create a comment associated to the request var comment = DataContext.Comments.Add(new Comment { CreatedByID = Identity.ID, CreatedOn = DateTime.UtcNow, Text = comments, ItemID = requestID }); //create the comment reference to the document DataContext.CommentReferences.Add(new CommentReference { ItemID = document.ID, ItemTitle = document.FileName, CommentID = comment.ID, Type = DTO.Enums.CommentItemTypes.Document }); if (taskID != Guid.Empty) { //create the comment reference to the task DataContext.CommentReferences.Add(new CommentReference { ItemID = taskID, CommentID = comment.ID, Type = DTO.Enums.CommentItemTypes.Task }); } await DataContext.SaveChangesAsync(); } return(Request.CreateResponse(HttpStatusCode.Created, new DTO.ExtendedDocumentDTO { ID = document.ID, Name = document.Name, FileName = document.FileName, MimeType = document.MimeType, Description = document.Description, Viewable = document.Viewable, ItemID = document.ItemID, ItemTitle = DataContext.Actions.Where(t => t.ID == taskID).Select(t => t.WorkflowActivityID.HasValue ? t.WorkflowActivity.Name : t.Subject).FirstOrDefault(), Kind = document.Kind, Length = document.Length, CreatedOn = document.CreatedOn, ContentCreatedOn = document.ContentCreatedOn, ContentModifiedOn = document.ContentModifiedOn, ParentDocumentID = document.ParentDocumentID, RevisionDescription = document.RevisionDescription, RevisionSetID = document.RevisionSetID, MajorVersion = document.MajorVersion, MinorVersion = document.MinorVersion, BuildVersion = document.BuildVersion, RevisionVersion = document.RevisionVersion, Timestamp = document.Timestamp, UploadedByID = document.UploadedByID, UploadedBy = Identity.UserName })); }
public async Task <HttpResponseMessage> Upload() { if (!Request.Content.IsMimeMultipartContent()) { return(Request.CreateErrorResponse(HttpStatusCode.UnsupportedMediaType, "Content must be mime multipart.")); } Guid taskID = Guid.Empty; Guid requestID = Guid.Empty; Stream stream = null; string documentName = string.Empty; string description = string.Empty; string filename = string.Empty; string comments = string.Empty; Guid? parentDocumentID = null; DTO.Enums.TaskItemTypes?taskItemType = null; var provider = new MultipartMemoryStreamProvider(); var o = await Request.Content.ReadAsMultipartAsync(provider); foreach (var c in o.Contents) { string parameterName = c.Headers.ContentDisposition.Name.Replace("\"", ""); switch (parameterName) { case "requestID": Guid.TryParse(await c.ReadAsStringAsync(), out requestID); break; case "taskID": Guid.TryParse(await c.ReadAsStringAsync(), out taskID); break; case "taskItemType": DTO.Enums.TaskItemTypes itemType; if (Enum.TryParse <DTO.Enums.TaskItemTypes>(await c.ReadAsStringAsync(), out itemType)) { taskItemType = itemType; } break; case "comments": comments = await c.ReadAsStringAsync(); break; case "files": filename = Path.GetFileName(c.Headers.ContentDisposition.FileName.Replace("\"", "")); stream = await c.ReadAsStreamAsync(); break; case "parentDocumentID": Guid parentID; if (Guid.TryParse(await c.ReadAsStringAsync(), out parentID)) { parentDocumentID = parentID; } break; case "description": description = await c.ReadAsStringAsync(); break; case "documentName": documentName = await c.ReadAsStringAsync(); break; } } if (taskID == Guid.Empty && requestID == Guid.Empty) { return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Unable to determine the documents owning object ID.")); } if (string.IsNullOrEmpty(filename)) { return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Filename is missing.")); } if (requestID == Guid.Empty) { //Get the requestID based on the task. requestID = await DataContext.ActionReferences.Where(tr => tr.TaskID == taskID && tr.Type == DTO.Enums.TaskItemTypes.Request).Select(tr => tr.ItemID).FirstOrDefaultAsync(); } //TODO: check for upload permission var document = new Document { Description = description, Name = string.IsNullOrEmpty(documentName) ? filename : documentName, FileName = filename, MimeType = Lpp.Utilities.FileEx.GetMimeTypeByExtension(filename), ItemID = taskID == Guid.Empty ? requestID : taskID, Length = stream.Length, RevisionDescription = comments, UploadedByID = Identity.ID, ParentDocumentID = parentDocumentID }; if (document.ParentDocumentID.HasValue) { var versionQuery = from d in DataContext.Documents let revisionID = DataContext.Documents.Where(p => p.ID == parentDocumentID).Select(p => p.RevisionSetID).FirstOrDefault() let taskReference = DataContext.ActionReferences.Where(tr => tr.ItemID == d.ID).DefaultIfEmpty() where d.RevisionSetID == revisionID orderby d.MajorVersion descending, d.MinorVersion descending, d.BuildVersion descending, d.RevisionVersion descending select new { d.ItemID, d.RevisionSetID, d.MajorVersion, d.MinorVersion, d.BuildVersion, d.RevisionVersion, TaskItemType = taskReference.Select(tr => (DTO.Enums.TaskItemTypes?)tr.Type).FirstOrDefault() }; var version = taskID != Guid.Empty ? await versionQuery.Where(d => d.ItemID == taskID).FirstOrDefaultAsync() : await versionQuery.Where(d => d.ItemID == requestID).FirstOrDefaultAsync(); if (version != null) { document.RevisionSetID = version.RevisionSetID; document.MajorVersion = version.MajorVersion; document.MinorVersion = version.MinorVersion; document.BuildVersion = version.BuildVersion; document.RevisionVersion = version.RevisionVersion + 1; //if the task item type has not been specified for the upload but the parent document had it specified, inhertit the type. if (taskItemType == null && version.TaskItemType.HasValue) { taskItemType = version.TaskItemType.Value; } } } if (!document.RevisionSetID.HasValue) { document.RevisionSetID = document.ID; } DataContext.Documents.Add(document); if (taskItemType.HasValue && taskID != Guid.Empty) { DataContext.ActionReferences.Add(new TaskReference { TaskID = taskID, ItemID = document.ID, Type = taskItemType.Value }); } await DataContext.SaveChangesAsync(); using (var dbStream = new Dns.Data.Documents.DocumentStream(DataContext, document.ID)) { await stream.CopyToAsync(dbStream); } if (!string.IsNullOrWhiteSpace(comments)) { //create a comment associated to the request var comment = DataContext.Comments.Add(new Comment { CreatedByID = Identity.ID, CreatedOn = DateTime.UtcNow, Text = comments, ItemID = requestID }); //create the comment reference to the document DataContext.CommentReferences.Add(new CommentReference { ItemID = document.ID, ItemTitle = document.FileName, CommentID = comment.ID, Type = DTO.Enums.CommentItemTypes.Document }); if (taskID != Guid.Empty) { //create the comment reference to the task DataContext.CommentReferences.Add(new CommentReference { ItemID = taskID, CommentID = comment.ID, Type = DTO.Enums.CommentItemTypes.Task }); } await DataContext.SaveChangesAsync(); } return(Request.CreateResponse(HttpStatusCode.Created, new DTO.ExtendedDocumentDTO { ID = document.ID, Name = document.Name, FileName = document.FileName, MimeType = document.MimeType, Description = document.Description, Viewable = document.Viewable, ItemID = document.ItemID, ItemTitle = DataContext.Actions.Where(t => t.ID == taskID).Select(t => t.WorkflowActivityID.HasValue ? t.WorkflowActivity.Name : t.Subject).FirstOrDefault(), Kind = document.Kind, Length = document.Length, CreatedOn = document.CreatedOn, ParentDocumentID = document.ParentDocumentID, RevisionDescription = document.RevisionDescription, RevisionSetID = document.RevisionSetID, MajorVersion = document.MajorVersion, MinorVersion = document.MinorVersion, BuildVersion = document.BuildVersion, RevisionVersion = document.RevisionVersion, Timestamp = document.Timestamp, UploadedByID = document.UploadedByID, UploadedBy = Identity.UserName })); }