public HttpResponseMessage UpdateIndiagrams([FromBody] List<IndiagramRequest> request) { if (request == null || request.Any(x => string.IsNullOrEmpty(x.Text))) { return Request.CreateBadRequestResponse(); } if (request.Count == 0) { return Request.CreateGoodReponse(new List<MappedIndiagramResponse>()); } long version = request.First().Version; if (request.Any(x => x.Version != version)) { return Request.CreateBadRequestResponse(); } using (IDatabaseService database = new DatabaseService()) { Device device = RequestContext.GetDevice(); if (!database.HasIndiagramVersion(device.UserId, version)) { return Request.CreateErrorResponse(HttpStatusCode.NotFound, "version not found"); } if (!database.CanPushInVersion(device.UserId, device.Id, version)) { return Request.CreateErrorResponse(HttpStatusCode.Forbidden, "Can not update in this version, version is closed or didn't created by this device"); } bool hasError = false; Queue<IndiagramRequest> input = new Queue<IndiagramRequest>(request); List<IndiagramRequest> orderedRequests = new List<IndiagramRequest>(); int noChangeCount = 0; Dictionary<long, long> mappedIds = new Dictionary<long, long>(); while (input.Count > 0) { IndiagramRequest item = input.Dequeue(); if (item.ParentId >= -1 || mappedIds.ContainsKey(item.ParentId)) { noChangeCount = 0; if (item.Id < -1) { mappedIds.Add(item.Id, 0); } orderedRequests.Add(item); } else { noChangeCount++; if (noChangeCount == input.Count) { return Request.CreateBadRequestResponse("Cycle/missing indiagrams detected in collection"); } input.Enqueue(item); } } List<MappedIndiagramResponse> result = orderedRequests.Select(x => { IndiagramForDevice indiagram; if (x.ParentId < 0) { x.ParentId = mappedIds[x.ParentId]; } if (x.Id < 0) { indiagram = database.CreateIndiagram(device.UserId, device.Id, x); mappedIds[x.Id] = indiagram.Id; } else { indiagram = database.UpdateIndiagram(device.UserId, device.Id, x); } if (indiagram == null) { hasError = true; return null; } return new MappedIndiagramResponse { SentId = x.Id, DatabaseId = indiagram.Id, ParentId = indiagram.ParentId }; }).ToList(); if (hasError) { return Request.CreateErrorResponse(HttpStatusCode.NotFound, "indiagram not found"); } return Request.CreateGoodReponse(result); } }
public HttpResponseMessage UpdateIndiagram([FromBody] IndiagramRequest request) { if (request == null || string.IsNullOrWhiteSpace(request.Text)) { return Request.CreateBadRequestResponse(); } using (IDatabaseService database = new DatabaseService()) { Device device = RequestContext.GetDevice(); if (!database.HasIndiagramVersion(device.UserId, request.Version)) { return Request.CreateErrorResponse(HttpStatusCode.NotFound, "version not found"); } if (!database.CanPushInVersion(device.UserId, device.Id, request.Version)) { return Request.CreateErrorResponse(HttpStatusCode.Forbidden, "Can not update in this version, version is closed or didn't created by this device"); } if (request.Id < 0) { IndiagramForDevice indiagram = database.CreateIndiagram(device.UserId, device.Id, request); return Request.CreateGoodReponse(ToResponse(indiagram)); } else { //update IndiagramForDevice indiagram = database.UpdateIndiagram(device.UserId, device.Id, request); if (indiagram == null) { return Request.CreateErrorResponse(HttpStatusCode.NotFound, "indiagram not found"); } return Request.CreateGoodReponse(ToResponse(indiagram)); } } }