コード例 #1
0
        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);
            }
        }
コード例 #2
0
        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));
                }

            }
        }