public async Task <bool> PreconditionsOK(Dictionary <string, string> propertiesAndHeaders, HttpResponse response) { string calendarResourceId; propertiesAndHeaders.TryGetValue("calendarResourceID", out calendarResourceId); string url; propertiesAndHeaders.TryGetValue("url", out url); if (calendarResourceId == null && !await _collectionRepository.Exist(url)) { response.StatusCode = (int)HttpStatusCode.NotFound; return(false); } if (calendarResourceId != null && !await _resourceRespository.Exist(url)) { response.StatusCode = (int)HttpStatusCode.NotFound; return(false); } return(true); }
//TODO: Poner esto en la capa de datos public async Task AddCalendarObjectResource(Dictionary <string, string> propertiesAndHeaders, HttpResponse response) { #region Extracting Properties string url; propertiesAndHeaders.TryGetValue("url", out url); string ifmatch; var ifMatchEtags = new List <string>(); propertiesAndHeaders.TryGetValue("If-Match", out ifmatch); if (ifmatch != null) { ifMatchEtags = ifmatch.Split(',').ToList(); } string ifnonematch; var ifNoneMatchEtags = new List <string>(); propertiesAndHeaders.TryGetValue("If-None-Match", out ifnonematch); if (ifnonematch != null) { ifNoneMatchEtags = ifnonematch.Split(',').ToList(); } string body; propertiesAndHeaders.TryGetValue("body", out body); #endregion //Note: calendar object resource = COR //CheckAllPreconditions PreconditionCheck = new PutPrecondition(StorageManagement, _collectionRespository, _resourceRespository); if (!await PreconditionCheck.PreconditionsOK(propertiesAndHeaders, response)) { return; } var resourceExist = await _resourceRespository.Exist(url); //If the ifmatch is included i look for the etag in the resource, but first the resource has to exist. //If all is ok and the if-match etag matches the etag in the resource then i update the resource. //If the if-match dont match then i set that the precondition failed. if (ifMatchEtags.Count > 0) { if (resourceExist) { var resource = _resourceRespository.Get(url); var resourceEtag = XmlTreeStructure.Parse(resource.Properties.FirstOrDefault(x => x.Name == "getetag")?.Value) .Value; if (ifMatchEtags.Contains(resourceEtag)) { await UpdateCalendarObjectResource(propertiesAndHeaders, response); return; } response.StatusCode = (int)HttpStatusCode.PreconditionFailed; return; } } if (ifNoneMatchEtags.Count > 0 && ifNoneMatchEtags.Contains("*")) { if (!resourceExist) { await CreateCalendarObjectResource(propertiesAndHeaders, response); return; } response.StatusCode = (int)HttpStatusCode.PreconditionFailed; return; } if (resourceExist && StorageManagement.ExistCalendarObjectResource(url)) { await UpdateCalendarObjectResource(propertiesAndHeaders, response); return; } await CreateCalendarObjectResource(propertiesAndHeaders, response); //return HTTP 201 Created }