public HomeModule(ArcOnlineHttpClient client) { Get["/", true] = async(_, ctx) => { var token = await client.GetToken(); return(View["index", token]); }; Get["/changelog"] = _ => View["changelog"]; }
public BookmarkModule(ArcOnlineHttpClient client) { Get["/bookmarks/{webmapid}", 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." } })); } string webmapid = _.webmapid.ToString(); Log.Debug("Getting webmap json for {Id}", webmapid); var webmap = await client.GetWebMapJsonFor(webmapid, token); return(Response.AsJson(webmap.Bookmarks)); }; Post["bookmarks/add", true] = async(_, ctx) => { var model = this.Bind <Bookmark>(); if (model.Extent == null || string.IsNullOrEmpty(model.Name)) { Log.Warning("invalid bookmark"); return(Response.AsJson(new Errorable { Error = new Error { Message = "Your bookmark is missing an extent or a name." } })); } var webmaps = this.Bind <WebMapIds>(); if (string.IsNullOrEmpty(webmaps.CollectorId) || string.IsNullOrEmpty(webmaps.DesktopId)) { Log.Warning("invalid web map ids {@Ids}", webmaps); return(Response.AsJson(new Errorable { Error = new Error { Message = "Your bookmark is missing an extent or a name." } })); } 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." } })); } Log.Debug("Getting webmap json for {Id}", webmaps.DesktopId); var desktopWebMap = await client.GetWebMapJsonFor(webmaps.DesktopId, token); Log.Debug("Getting webmap json for {Id}", webmaps.CollectorId); var collectorWebMap = await client.GetWebMapJsonFor(webmaps.CollectorId, token); if (desktopWebMap.Error != null) { return(Response.AsJson(desktopWebMap.Error)); } if (collectorWebMap.Error != null) { return(Response.AsJson(collectorWebMap.Error)); } desktopWebMap.Bookmarks.Add(model); collectorWebMap.Bookmarks = desktopWebMap.Bookmarks; Log.Debug("Updating webmap json for {Id}", webmaps.DesktopId); using (var formContent = new MultipartFormDataContent()) using (var formContent2 = new MultipartFormDataContent()) { try { formContent.Add(new StringContent(JsonConvert.SerializeObject(desktopWebMap, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver(), NullValueHandling = NullValueHandling.Ignore })), "text"); formContent.Add(new StringContent(token), "token"); formContent.Add(new StringContent("json"), "f"); formContent2.Add(new StringContent(JsonConvert.SerializeObject(collectorWebMap, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver(), NullValueHandling = NullValueHandling.Ignore })), "text"); formContent2.Add(new StringContent(token), "token"); formContent2.Add(new StringContent("json"), "f"); } 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 result = await client.UpdateWebMapJsonFor(webmaps.DesktopId, formContent); if (!result.Success) { return(result); } result = await client.UpdateWebMapJsonFor(webmaps.CollectorId, formContent2); if (!result.Success) { return(result); } return(Response.AsJson(desktopWebMap.Bookmarks)); } }; Delete["bookmarks/remove", true] = async(_, ctx) => { var model = this.Bind <Bookmark>(); if (string.IsNullOrEmpty(model.Name)) { Log.Warning("invalid bookmark"); return(Response.AsJson(new Errorable { Error = new Error { Message = "Your bookmark is missing an extent or a name." } })); } var webmaps = this.Bind <WebMapIds>(); if (string.IsNullOrEmpty(webmaps.CollectorId) || string.IsNullOrEmpty(webmaps.DesktopId)) { Log.Warning("invalid web map ids {@Ids}", webmaps); return(Response.AsJson(new Errorable { Error = new Error { Message = "Your bookmark is missing an extent or a name." } })); } 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." } })); } Log.Debug("Getting webmap json for {Id}", webmaps.DesktopId); var desktopWebMap = await client.GetWebMapJsonFor(webmaps.DesktopId, token); Log.Debug("Getting webmap json for {Id}", webmaps.CollectorId); var collectorWebMap = await client.GetWebMapJsonFor(webmaps.CollectorId, token); if (desktopWebMap.Error != null) { return(Response.AsJson(desktopWebMap.Error)); } if (collectorWebMap.Error != null) { return(Response.AsJson(collectorWebMap.Error)); } desktopWebMap.Bookmarks.RemoveAll(x => string.Equals(x.Name, model.Name, StringComparison.InvariantCultureIgnoreCase)); collectorWebMap.Bookmarks = desktopWebMap.Bookmarks; Log.Debug("Updating webmap json for {Id}", desktopWebMap); using (var formContent = new MultipartFormDataContent()) using (var formContent2 = new MultipartFormDataContent()) { try { formContent.Add(new StringContent(JsonConvert.SerializeObject(desktopWebMap, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver(), NullValueHandling = NullValueHandling.Ignore })), "text"); formContent.Add(new StringContent(token), "token"); formContent.Add(new StringContent("json"), "f"); formContent2.Add(new StringContent(JsonConvert.SerializeObject(collectorWebMap, Formatting.Indented, new JsonSerializerSettings { ContractResolver = new Newtonsoft.Json.Serialization.CamelCasePropertyNamesContractResolver(), NullValueHandling = NullValueHandling.Ignore })), "text"); formContent2.Add(new StringContent(token), "token"); formContent2.Add(new StringContent("json"), "f"); } 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 result = await client.UpdateWebMapJsonFor(webmaps.DesktopId, formContent); if (!result.Success) { return(result); } result = await client.UpdateWebMapJsonFor(webmaps.CollectorId, formContent2); if (!result.Success) { return(result); } return(Response.AsJson(desktopWebMap.Bookmarks)); } }; }
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))); }; }
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; }))); }; }
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)); } }; }