public async Task <MasterDataKeyValue> Save(JObject data) { dynamic serviceDto = data; int? serviceId = serviceDto.Id; var service = new MasterDataKeyValue { Id = serviceId ?? 0, TypeId = (int)EntityIdentity.Service }; bool isNew = serviceDto.IsNew; bool checkIn = serviceDto.CheckIn; string comment = serviceDto.Comment; var currentService = await _contentManagementContext .MasterDataKeyValues.AsNoTracking().SingleOrDefaultAsync(sv => sv.Id == service.Id && sv.TypeId == (int)EntityIdentity.Service); if (!isNew) { if (currentService == null) { throw new KhodkarInvalidException(LanguageManager.ToAsErrorMessage(ExceptionKey.ServiceNotFound)); } if (currentService.EditMode) { _sourceControl.CheckCodeCheckOute(currentService); } service = currentService; service.RowVersion = serviceDto.RowVersion; _contentManagementContext.MasterDataKeyValues.Attach(service); } else { _contentManagementContext.MasterDataKeyValues.Add(service); } string serviceCode = serviceDto.Code; if (serviceCode.IndexOf(_codeTemplate.ServicePrefix, StringComparison.Ordinal) != 0) { serviceCode = _codeTemplate.ServicePrefix + "." + serviceCode; } string serviceUrl = serviceDto.Url; if (serviceUrl.IndexOf(Helper.RootUrl, StringComparison.Ordinal) != 0) { serviceUrl = Helper.RootUrl + serviceUrl; } if (serviceUrl.LastIndexOf(Helper.RootUrl, StringComparison.Ordinal) == serviceUrl.Length - 1 && serviceUrl != "/") { serviceUrl = serviceUrl.Remove(serviceUrl.LastIndexOf(Helper.RootUrl, StringComparison.Ordinal)); } var repeatedService = await _contentManagementContext .MasterDataKeyValues.Where(sr => sr.PathOrUrl == serviceUrl && sr.TypeId == (int)EntityIdentity.Service).CountAsync() ; if ((repeatedService > 0 && isNew) || (repeatedService > 1 && !isNew)) { throw new KhodkarInvalidException(LanguageManager.ToAsErrorMessage(ExceptionKey.RepeatedValue, serviceUrl)); } int?parentId = serviceDto.ParentId; if (currentService?.ParentId != parentId || isNew) { var parentCode = await _contentManagementContext .MasterDataKeyValues.SingleOrDefaultAsync(sr => sr.Id == parentId && sr.TypeId == (int)EntityIdentity.Service); if (parentCode == null) { throw new KhodkarInvalidException(LanguageManager.ToAsErrorMessage(ExceptionKey.ParentRecordNotFound)); } AuthorizeManager.CheckParentNodeModifyAccessForAddingChildNode(parentCode, parentCode.Id); } service.ParentId = parentId; service.Name = serviceDto.Name; service.Code = serviceCode; repeatedService = await _contentManagementContext .MasterDataKeyValues.Where(sr => sr.Code == service.Code && sr.TypeId == (int)EntityIdentity.Service) .CountAsync(); if ((repeatedService > 0 && isNew) || (repeatedService > 1 && !isNew)) { throw new KhodkarInvalidException(LanguageManager.ToAsErrorMessage(ExceptionKey.RepeatedValue, service.Code)); } service.Guid = serviceDto.Guid; service.Description = serviceDto.Description; service.Version = (currentService?.Version ?? 0) + 1; service.PathOrUrl = serviceUrl; try { service.Order = serviceDto.Order; } catch (Exception) { service.Order = 1; } //LOG SERVICE EVENT?1:TRUE,2:FALSE try { service.Key = serviceDto.Key; } catch (Exception) { service.Key = 0; } service.IsLeaf = serviceDto.IsLeaf; service.Language = Config.DefaultsLanguage; //if(service.IsLeaf) if (currentService != null) { service.ViewRoleId = currentService.ViewRoleId; service.ModifyRoleId = currentService.ModifyRoleId; service.AccessRoleId = currentService.AccessRoleId; } AuthorizeManager.SetAndCheckModifyAndAccessRole(service, serviceDto); service.Status = serviceDto.Status; service.EditMode = serviceDto.EditMode; service.EnableCache = serviceDto.EnableCache; try { service.SlidingExpirationTimeInMinutes = serviceDto.SlidingExpirationTimeInMinutes; } catch (Exception) { service.SlidingExpirationTimeInMinutes = 0; } await _contentManagementContext.SaveChangesAsync(); string jsCode = serviceDto.JsCode; if (!string.IsNullOrEmpty(jsCode)) { await _sourceControl.AddChange(Config.ServicesSourceCodePath, service.Guid + ".js", jsCode, service.Version, comment); if (checkIn) { await WriteFileAsync(Config.ServicesSourceCodePath, service.Guid, ".js", jsCode); } } CacheManager.ClearAllItemContainKey(service.PathOrUrl); UpdateServiceSettingOfWebConfig(service); return(service); }