Ejemplo 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;
                })));
            };
        }
Ejemplo n.º 2
0
        public AttachmentModule(ArcOnlineHttpClient client)
        {
            Get["/attachment/{featureId}", true] = async(_, ctx) =>
            {
                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);

                if (response.Result.Error != null)
                {
                    Log.Error("There was an issue getting attachments {@Error}", response.Result.Error);

                    return(Response.AsJson(new Errorable
                    {
                        Error = new Error
                        {
                            Message = response.Result.Error.Messages
                        }
                    }));
                }
                // we don't have attachments exit early
                if (!response.Result.AttachmentGroups.Any() || !response.Result.AttachmentGroups[0].AttachmentInfos.Any())
                {
                    return(Response.AsJson(new GenericAttachment()));
                }

                queryParams = new[]
                {
                    new KeyValuePair <string, string>("token", token)
                };

                formUrl            = new FormUrlEncodedContent(queryParams);
                querystringContent = await formUrl.ReadAsStringAsync();

                var files = response.Result.AttachmentGroups[0].AttachmentInfos
                            .Select(x => new GenericAttachment.GenericFile(
                                        GetDisplayName(x.Name),
                                        string.Format("{0}/{1}/attachments/{2}?{3}", Request.Query["url"], _.featureId.ToString(), x.Id, querystringContent)
                                        ));

                return(Response.AsJson(new GenericAttachment(files)));
            };
        }