예제 #1
0
        public async Task <HttpResponseMessage> Insert()
        {
            var            user          = GetSessionUser(Request.Headers.GetCookies().FirstOrDefault());
            List <NodeDto> successEntity = new List <NodeDto>(); //成功处理的Entity信息
            JDBCEntity     currentEntity = null;                 //当前处理的Entity信息

            try
            {
                Uri uri = ParseToQueryUri(Request.RequestUri);
                List <JDBCEntity> parents = (await MyCoreApi.FindNodeByUriAsync(uri)).ToList(); //根据uri查找父节点
                if (uri.PathAndQuery.Equals("/path/") || uri.PathAndQuery.Equals("/id/"))       //添加根节点的情形
                {
                    parents.Add(new Experiment {
                        Id = Guid.Empty
                    });
                }
                else if (parents.Count() == 0)//根节点不存在
                {
                    throw new Exception("Parent node not exist!");
                }
                NameValueCollection form    = Request.Content.ReadAsFormDataAsync().Result;
                JDBCEntity          newNode = null;
                var type   = GetValueFromForm(form, "type");
                var name   = GetValueFromForm(form, "name");
                var extras = GetValuesFromForm(form, "extra[]", true);
                if (string.IsNullOrWhiteSpace(name))
                {
                    throw new Exception("Entity name can not be empty!");
                }
                switch (type.ToLower())
                {
                case "experiment":
                {
                    newNode = new Experiment(name);
                }
                break;

                case "signal":
                {
                    var init     = GetValueFromForm(form, "init");
                    var datatype = GetValueFromForm(form, "datatype");
                    newNode = MyCoreApi.CreateSignal(datatype, name, init.Replace(";", "&").Replace(",", "&").Trim("'\"()[]{}".ToCharArray()));
                }
                break;

                default:
                    throw new Exception("Entity type is not supported!");
                }
                if (extras != null)//添加ExtraInformation
                {
                    foreach (var extra in extras)
                    {
                        var index = extra.IndexOf(":::");
                        if (index < 0)
                        {
                            return(new HttpResponseMessage(HttpStatusCode.Forbidden));
                        }
                        var key   = extra.Substring(0, index);
                        var value = extra.Substring(index + 3);
                        if (key.Equals("") || value.Equals("") || newNode.IfExtraInformationContainsKey(key))
                        {
                            return(new HttpResponseMessage(HttpStatusCode.Forbidden));
                        }
                        newNode.AddExtraInformation(key, value);
                    }
                }

                if (newNode == null)
                {
                    return(new HttpResponseMessage {
                        StatusCode = HttpStatusCode.Forbidden, Content = new StringContent("Failed to create new node!")
                    });
                }
                foreach (var parent in parents)
                {
                    if (!await MyCoreApi.Authorization(parent.Id, user, "1"))
                    {
                        throw new Exception("Not authorization!");
                    }
                    currentEntity = parent;
                    newNode.Id    = Guid.NewGuid();
                    newNode.SetUser(user.UserName);
                    var node = await MyCoreApi.AddOneToExperimentAsync(parent.Id, newNode); //添加signal

                    successEntity.Add(Mapper.Map <NodeDto>(node));                          //保存处理结果
                }
                return(new HttpResponseMessage {
                    StatusCode = HttpStatusCode.OK, Content = new StringContent(SerializeObjectToString(successEntity), System.Text.Encoding.GetEncoding("UTF-8"), "application/json")
                });
            }
            catch (Exception e)
            {
                if (currentEntity == null)
                {
                    return(new HttpResponseMessage {
                        StatusCode = HttpStatusCode.Forbidden, Content = new StringContent(e.Message)
                    });
                }
                var response = new ResponseEntityMessage
                {
                    Fail = new
                    {
                        Description = e.InnerException != null ? e.InnerException.Message : e.Message,
                        Id          = currentEntity.Id,
                        Path        = currentEntity.Path
                    },
                    Success = successEntity
                };
                return(new HttpResponseMessage {
                    StatusCode = HttpStatusCode.Forbidden, Content = new StringContent(SerializeObjectToString(response), System.Text.Encoding.GetEncoding("UTF-8"), "application/json")
                });
            }
        }