private dynamic CreateResource( IRequest request, HttpRequestMethod requestMethod, PermissionHandler <TRelation, TUser> permissionHandler, string jsonData) { var jsonResolver = new APIJsonResolver <TRelation, TUser> { DbContext = dbContext, PermissionHandler = permissionHandler, ModelAction = ModelAction.Create, RequestMethod = requestMethod, IRequest = request, IncludeKey = false, IncludeBindNever = false, EngineService = EngineService }; var serializerSettings = JsonConvert.DefaultSettings(); serializerSettings.ContractResolver = jsonResolver; var model = JsonConvert.DeserializeObject( value: jsonData, type: request.Temp_ResourceType, settings: serializerSettings); dbContext.Add(model); dbContext.SaveChanges(); var intraction = new ModelInteraction <TRelation> { CreatorId = permissionHandler.getRequesterID(), FirstModelId = permissionHandler.getRequesterID(), SecondModelId = model.GetKeyPropertyValue(), IntractionType = (TRelation)Enum.Parse(typeof(TRelation), "Global"), ModelAction = ModelAction.Create }; dbContext.MagicAddIntraction(intraction, EngineService.MapRelationToType("Global")); dbContext.SaveChangesAsync(); EngineService.OnResourceCreated(dbContext, request, model, intraction); return(new OkObjectResult(new { GeneratedID = model.GetKeyPropertyValue() })); }
private dynamic PatchResource( IRequest request, HttpRequestMethod requestMethod, PermissionHandler <TRelation, TUser> permissionHandler, string jsonData) { var jsonResolver = new APIJsonResolver <TRelation, TUser> { DbContext = dbContext, PermissionHandler = permissionHandler, ModelAction = ModelAction.Create, RequestMethod = requestMethod, IRequest = request, EngineService = EngineService, IncludeKey = true, IncludeBindNever = false }; var serializerSettings = JsonConvert.DefaultSettings(); serializerSettings.ContractResolver = jsonResolver; var model = JsonConvert.DeserializeObject( jsonData, request.Temp_ResourceType, serializerSettings); var oldModel = APIUtils.GetResource(dbContext, request); if (oldModel == null) { return(new NotFoundResult()); } if (oldModel is IdentityUser) { return(new BadRequestObjectResult(new APIError { Message = "User model can not edited by general api, this must be handled using an special AccountController." })); } var modelKey = model.GetType().GetPropertiesWithAttribute(typeof(KeyAttribute)).FirstOrDefault(); if (modelKey == null) { return(new ForbidResult()); } if (request.IdentifierName != modelKey.Name) { var identifierProperty = model.GetType().GetCustomAttributes <IdentifierValidatorAttribute> () .Where(attribute => attribute.PropertyName == request.IdentifierName) .FirstOrDefault(); if (identifierProperty == null) { return(new ForbidResult()); } modelKey.SetValue(model, modelKey.GetValue(oldModel)); } var modelKeyValue = modelKey.GetValue(model).ToString(); var isValidIdentifier = modelKeyValue != null && modelKeyValue != request.IdentifierValue; if (!isValidIdentifier || !verifyModelRelationChain(model)) { return(BadRequest(new APIError { Message = "Error: Invalid relation in received model, it can be happend when you are not " + "permitted for this action or there are some invalid id(s)." })); } // dbContext.Update (model); // ExcludeAttributes (model); IncludeAttributes(model); var intraction = new ModelInteraction <TRelation> { CreatorId = permissionHandler.getRequesterID(), FirstModelId = permissionHandler.getRequesterID(), SecondModelId = modelKeyValue, ModelAction = ModelAction.Update }; dbContext.MagicAddIntraction(intraction, EngineService.MapRelationToType("Global")); dbContext.SaveChanges(); EngineService.OnResourcePatched(dbContext, request, model); return(new OkResult()); }