Esempio n. 1
0
        public SearchModule(IRepository repo, ArcOnlineHttpClient client)
        {
            Get["/search/{facilityNumber}/facility/{facilityId}/feature/{featureId}", true] = async(_, ctx) =>
            {
                Log.Debug("Searching Edocs for attachments {FacilityNumber} {FacilityId} {FeatureId}", _.facilityNumber, _.facilityId, _.featureId);
                var facilityNumber = _.facilityNumber.ToString();
                var facilityId     = _.facilityId.ToString();

                IEnumerable <EDocEntry> result = await repo.Get(facilityNumber).ConfigureAwait(false);

                // we don't have any documents so exit quickly
                if (!result.Any())
                {
                    Log.Debug("No results for {FacilityNumber} {FacilityId} {FeatureId}", _.facilityNumber, _.facilityId, _.featureId);

                    return(Response.AsJson(result));
                }

                var token = await client.GetToken().ConfigureAwait(false);

                if (string.IsNullOrEmpty(token))
                {
                    Log.Warning("Token Expired");
                    return(Response.AsJson(new Errorable
                    {
                        Error = new Error
                        {
                            Message = "Your arcgis online token expired. Please sign in again."
                        }
                    }));
                }

                var queryParams = new[]
                {
                    new KeyValuePair <string, string>("objectIds", _.featureId.ToString()),
                    new KeyValuePair <string, string>("f", "json"),
                    new KeyValuePair <string, string>("token", token)
                };

                const string attachmentUrl      = "/queryAttachments";
                var          formUrl            = new FormUrlEncodedContent(queryParams);
                var          querystringContent = await formUrl.ReadAsStringAsync();

                var url = string.Format("{0}/{1}?{2}", Request.Query["url"], attachmentUrl, querystringContent);
                ArcOnlineResponse <AttachmentResponse> response = await client.GetAttachmentsFor(url).ConfigureAwait(false);

                // we don't have attachments exit early
                if (!response.Result.AttachmentGroups.Any() || !response.Result.AttachmentGroups[0].AttachmentInfos.Any())
                {
                    Log.Debug("No attachments for {FacilityNumber} {FacilityId} {FeatureId}", _);
                    return(Response.AsJson(result));
                }

                var filenames = response.Result.AttachmentGroups[0].AttachmentInfos.ToDictionary(key => string.Format("{0}?{1}", key.Name, key.Id), value => value.Id);

                return(Response.AsJson(result.Select(mapped =>
                {
                    var updated = new EDocEntry(mapped, facilityId);
                    var uploads = filenames.Where(key =>
                    {
                        var name = key.Key.Split('?')[0];
                        return string.Compare(name, updated.File, StringComparison.InvariantCultureIgnoreCase) == 0;
                    }).ToList();

                    updated.Uploaded = uploads.Any();
                    if (updated.Uploaded)
                    {
                        updated.UploadId = uploads.First().Value;
                    }

                    return updated;
                })));
            };
        }
Esempio n. 2
0
        public UploadModule(IRepository repository, IShareMappable edocFolder, ArcOnlineHttpClient client)
        {
            Post["/upload", true] = async(_, ctx) =>
            {
                var model = this.Bind <UploadAttachment>();
                var edoc  = repository.Get(model.Id);
                edoc = new EDocEntry(edoc, model.FacilityId);
                var filename = Path.GetFileName(edoc.Path);

                var extension   = Path.GetExtension(filename);
                var contentType = MimeTypeMap.GetMimeType(extension);

                try
                {
                    var file      = edocFolder.GetPathFrom(edoc.Path);
                    var fileInfo  = new FileInfo(file);
                    var byteCount = fileInfo.Length;

                    if (byteCount > MaxUpload)
                    {
                        var readableSize = ReadableFileSizer.MakeReadable(byteCount);
                        Log.Warning("{file} is larger than allowed upload. {size}", edoc.Path, readableSize);

                        return(Response.AsJson(new Errorable
                        {
                            Error = new Error
                            {
                                Message = $"This file is too large to be stored in ArcGIS Online. The file is around {readableSize} " +
                                          $"and the allowable size is {ReadableFileSizer.MakeReadable(MaxUpload)}."
                            }
                        }));
                    }

                    var token = await client.GetToken();

                    // upload to arcgis online
                    using (Stream document = File.OpenRead(file))
                        using (var formContent = new MultipartFormDataContent())
                        {
                            try
                            {
                                var streamContent = new StreamContent(document);
                                streamContent.Headers.Add("Content-Type", contentType);
                                streamContent.Headers.Add("Content-Disposition", $"form-data; name=\"file\"; filename=\"{edoc.File}\"");
                                formContent.Add(streamContent, "file", edoc.File);
                                formContent.Add(new StringContent("json"), "f");
                                formContent.Add(new StringContent(token), "token");
                            }
                            catch (ArgumentNullException ex)
                            {
                                Log.Error(ex, "Token expired?");
                                return(Response.AsJson(new Errorable
                                {
                                    Error = new Error
                                    {
                                        Message = "Your arcgis online token expired. Please sign in again."
                                    }
                                }));
                            }

                            var url      = $"{model.ServiceUrl}/{model.FeatureId}{AttachmentUrl}";
                            var response = await client.UploadDocument(url, formContent).ConfigureAwait(false);

                            return(Response.AsJson(response.Result));
                        }
                }
                catch (Exception ex)
                {
                    Log.Error(ex, "Unknown error getting EDocs File");
                    return(Response.AsJson(new Errorable
                    {
                        Error = new Error
                        {
                            Message = $"Unknown error getting EDocs File. {ex.Message}"
                        }
                    }));
                }
            };

            Delete["/upload", true] = async(_, ctx) =>
            {
                var model = this.Bind <RemoveAttachment>();
                using (var formContent = new MultipartFormDataContent())
                {
                    try
                    {
                        var token = await client.GetToken();

                        formContent.Add(new StringContent("json"), "f");
                        formContent.Add(new StringContent(model.UploadId.ToString()), "attachmentIds");
                        formContent.Add(new StringContent(token), "token");
                    }
                    catch (ArgumentNullException ex)
                    {
                        Log.Error(ex, "Token expired?");
                        return(Response.AsJson(new Errorable
                        {
                            Error = new Error
                            {
                                Message = "Your arcgis online token expired. Please sign in again."
                            }
                        }));
                    }

                    var url      = $"{model.ServiceUrl}/{model.FeatureId}{DeleteAttachmentUrl}";
                    var response = await client.DeleteDocument(url, formContent);

                    return(Response.AsJson(response.Result));
                }
            };

            Post["/upload/external", true] = async(_, ctx) =>
            {
                var model      = this.Bind <UploadExternal>();
                var attachment = Request.Files.SingleOrDefault();
                if (attachment == null || attachment.Value.Length < 1)
                {
                    return(Response.AsJson(new Errorable
                    {
                        Error = new Error
                        {
                            Message = "The file is empty."
                        }
                    }));
                }

                var extension   = Path.GetExtension(attachment.Name);
                var contentType = MimeTypeMap.GetMimeType(extension);

                if (string.IsNullOrEmpty(extension))
                {
                    extension = "";
                }

                var filename  = attachment.Name.Replace(extension, "");
                var extLength = 0;

                if (!string.IsNullOrEmpty(extension))
                {
                    extLength = extension.Length;
                }

                const int maxSize = 100;
                var       stripNonAlphaNumeric = new Regex("[^a-zA-Z0-9-]");
                var       charactersAllowed    = maxSize - extLength;
                var       title = filename.Replace('/', '-');
                title = stripNonAlphaNumeric.Replace(title, "");

                if (title.Length > charactersAllowed)
                {
                    title = title.Substring(0, charactersAllowed);
                }

                var day   = DateTime.Today.Day.ToString("d2");
                var month = DateTime.Today.Month.ToString("d2");

                var renamed = $"x{month}-{day}x{title}{extension}";

                using (var document = attachment.Value)
                    using (var formContent = new MultipartFormDataContent())
                    {
                        try
                        {
                            var token = await client.GetToken();

                            var streamContent = new StreamContent(document);
                            streamContent.Headers.Add("Content-Type", contentType);
                            streamContent.Headers.Add("Content-Disposition", $"form-data; name=\"file\"; filename=\"{renamed}\"");
                            formContent.Add(streamContent, "file", attachment.Name);
                            formContent.Add(new StringContent("json"), "f");
                            formContent.Add(new StringContent(token), "token");
                        }
                        catch (ArgumentNullException)
                        {
                            return(Response.AsJson(new Errorable
                            {
                                Error = new Error
                                {
                                    Message = "Your arcgis online token expired. Please sign in again."
                                }
                            }));
                        }

                        var url      = $"{model.ServiceUrl}/{model.FeatureId}{AttachmentUrl}";
                        var response = await client.UploadDocument(url, formContent);

                        return(Response.AsJson(response.Result));
                    }
            };
        }