コード例 #1
0
        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));
        }
コード例 #2
0
        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
            }));
        }
コード例 #3
0
        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
            }));
        }