Esempio n. 1
0
        public async Task <HttpResponseMessage> UploadChunked()
        {
            if (!Request.Content.IsMimeMultipartContent())
            {
                return(Request.CreateErrorResponse(HttpStatusCode.UnsupportedMediaType, "Content must be mime multipart."));
            }

            string uploadPath = System.Web.Configuration.WebConfigurationManager.AppSettings["DocumentsUploadFolder"] ?? string.Empty;

            if (string.IsNullOrEmpty(uploadPath))
            {
                uploadPath = System.Web.HttpContext.Current.Server.MapPath("~/App_Data/Uploads/");
            }
            if (!Directory.Exists(uploadPath))
            {
                Directory.CreateDirectory(uploadPath);
            }

            var provider = new ChunkedMultipartFormDataStreamDbProvider <ExtendedDocumentDTO>(uploadPath, HttpContext.Current.Request, DataContext, Identity);

            var o = await Request.Content.ReadAsMultipartAsync(provider);

            var result = o.GetResult();

            if (result.uploaded == false)
            {
                return(Request.CreateResponse(HttpStatusCode.Created, result));
            }

            if (o.TaskID == Guid.Empty && o.RequestID == Guid.Empty && o.ResponseID == Guid.Empty)
            {
                return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Unable to determine RequestID, ResponseID, and TaskID"));
            }

            if (string.IsNullOrEmpty(o.FileName))
            {
                return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Filename is missing."));
            }

            if (o.RequestID == Guid.Empty && o.TaskID != Guid.Empty)
            {
                //Get the requestID based on the task.
                o.RequestID = await DataContext.ActionReferences.Where(tr => tr.TaskID == o.TaskID && tr.Type == DTO.Enums.TaskItemTypes.Request).Select(tr => tr.ItemID).FirstOrDefaultAsync();
            }
            await o.SetUpDocumentInDatabase();

            result.Result = new DTO.ExtendedDocumentDTO
            {
                ID                  = o.Doc.ID,
                Name                = o.Doc.Name,
                FileName            = o.Doc.FileName,
                MimeType            = o.Doc.MimeType,
                Description         = o.Doc.Description,
                Viewable            = o.Doc.Viewable,
                ItemID              = o.Doc.ItemID,
                ItemTitle           = DataContext.Actions.Where(t => t.ID == o.TaskID).Select(t => t.WorkflowActivityID.HasValue ? t.WorkflowActivity.Name : t.Subject).FirstOrDefault(),
                Kind                = o.Doc.Kind,
                Length              = o.Doc.Length,
                CreatedOn           = o.Doc.CreatedOn,
                ContentCreatedOn    = o.Doc.ContentCreatedOn,
                ContentModifiedOn   = o.Doc.ContentModifiedOn,
                ParentDocumentID    = o.Doc.ParentDocumentID,
                RevisionDescription = o.Doc.RevisionDescription,
                RevisionSetID       = o.Doc.RevisionSetID,
                MajorVersion        = o.Doc.MajorVersion,
                MinorVersion        = o.Doc.MinorVersion,
                BuildVersion        = o.Doc.BuildVersion,
                RevisionVersion     = o.Doc.RevisionVersion,
                Timestamp           = o.Doc.Timestamp,
                UploadedByID        = o.Doc.UploadedByID,
                UploadedBy          = Identity.UserName
            };

            await o.StreamDocumentToDatabase();

            return(Request.CreateResponse(HttpStatusCode.Created, result));
        }
        public async Task <HttpResponseMessage> UploadChunked()
        {
            if (!Request.Content.IsMimeMultipartContent())
            {
                return(Request.CreateErrorResponse(HttpStatusCode.UnsupportedMediaType, "Content must be mime multipart."));
            }

            string uploadPath = System.Web.Configuration.WebConfigurationManager.AppSettings["DocumentsUploadFolder"] ?? string.Empty;

            if (string.IsNullOrEmpty(uploadPath))
            {
                uploadPath = System.Web.HttpContext.Current.Server.MapPath("~/App_Data/Uploads/");
            }
            if (!Directory.Exists(uploadPath))
            {
                Directory.CreateDirectory(uploadPath);
            }

            var provider = new ChunkedMultipartFormDataStreamDbProvider <ExtendedDocumentDTO>(uploadPath, HttpContext.Current.Request, DataContext, Identity);

            var o = await Request.Content.ReadAsMultipartAsync(provider);

            var result = o.GetResult();

            if (result.uploaded == false)
            {
                return(Request.CreateResponse(HttpStatusCode.Created, result));
            }

            if (o.TaskID == Guid.Empty && o.RequestID == Guid.Empty && o.ResponseID == Guid.Empty)
            {
                return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Unable to determine RequestID, ResponseID, and TaskID"));
            }

            if (string.IsNullOrEmpty(o.FileName))
            {
                return(Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Filename is missing."));
            }

            if (o.RequestID == Guid.Empty && o.TaskID != Guid.Empty)
            {
                //Get the requestID based on the task.
                o.RequestID = await DataContext.ActionReferences.Where(tr => tr.TaskID == o.TaskID && tr.Type == DTO.Enums.TaskItemTypes.Request).Select(tr => tr.ItemID).FirstOrDefaultAsync();
            }
            await o.SetUpDocumentInDatabase();

            result.Result = new DTO.ExtendedDocumentDTO
            {
                ID                  = o.Doc.ID,
                Name                = o.Doc.Name,
                FileName            = o.Doc.FileName,
                MimeType            = o.Doc.MimeType,
                Description         = o.Doc.Description,
                Viewable            = o.Doc.Viewable,
                ItemID              = o.Doc.ItemID,
                ItemTitle           = DataContext.Actions.Where(t => t.ID == o.TaskID).Select(t => t.WorkflowActivityID.HasValue ? t.WorkflowActivity.Name : t.Subject).FirstOrDefault(),
                Kind                = o.Doc.Kind,
                Length              = o.Doc.Length,
                CreatedOn           = o.Doc.CreatedOn,
                ContentCreatedOn    = o.Doc.ContentCreatedOn,
                ContentModifiedOn   = o.Doc.ContentModifiedOn,
                ParentDocumentID    = o.Doc.ParentDocumentID,
                RevisionDescription = o.Doc.RevisionDescription,
                RevisionSetID       = o.Doc.RevisionSetID,
                MajorVersion        = o.Doc.MajorVersion,
                MinorVersion        = o.Doc.MinorVersion,
                BuildVersion        = o.Doc.BuildVersion,
                RevisionVersion     = o.Doc.RevisionVersion,
                Timestamp           = o.Doc.Timestamp,
                UploadedByID        = o.Doc.UploadedByID,
                UploadedBy          = Identity.UserName
            };

            await o.StreamDocumentToDatabase();

            if (o.Doc.MimeType.Equals("application/json", StringComparison.OrdinalIgnoreCase) && o.Doc.Kind.Equals(Lpp.Dns.DTO.Enums.DocumentKind.Request, StringComparison.OrdinalIgnoreCase) && o.Doc.ParentDocumentID.HasValue)
            {
                try
                {
                    using (var db = new DataContext())
                    {
                        //if the document has a mime type of json, and the document kind is for request assume it is an update to the request json. Replace the Query property of the request after updating the header of the request.
                        var requestDocument = await db.Documents.FindAsync(o.Doc.ID);

                        var json       = System.Text.Encoding.UTF8.GetString(requestDocument.GetData(db));
                        var requestDTO = Lpp.Dns.DTO.QueryComposer.QueryComposerDTOHelpers.DeserializeRequest(json);

                        var request = await db.Requests.FindAsync(o.RequestID);

                        requestDTO.Header.ID          = request.ID;
                        requestDTO.Header.Name        = request.Name;
                        requestDTO.Header.Priority    = request.Priority;
                        requestDTO.Header.SubmittedOn = request.SubmittedOn;

                        var forgotPasswordUrl = new Uri(System.Web.Configuration.WebConfigurationManager.AppSettings["ResetPasswordUrl"]);
                        var uriBuilder        = new UriBuilder(forgotPasswordUrl.Scheme, forgotPasswordUrl.Host, forgotPasswordUrl.IsDefaultPort ? -1 : forgotPasswordUrl.Port, "querycomposer/summaryview");
                        uriBuilder.Query          = "ID=" + request.ID.ToString("D");
                        requestDTO.Header.ViewUrl = uriBuilder.Uri.AbsoluteUri;

                        request.Query = Newtonsoft.Json.JsonConvert.SerializeObject(requestDTO);
                        await db.SaveChangesAsync();

                        db.Database.ExecuteSqlCommand($"UPDATE Documents SET [Data] = NULL WHERE ID ='{ o.Doc.ID }'");
                        o.Doc.SetData(db, System.Text.Encoding.UTF8.GetBytes(request.Query));
                    }
                }
                catch (Exception ex)
                {
                    //DO NOT affect the saving of the document, log the error for debugging purposes.
                    Logger.Error($"Error deserializing document to QueryComposerRequestDTO, DocumentID:{ o.Doc.ID }", ex);
                }
            }

            return(Request.CreateResponse(HttpStatusCode.Created, result));
        }