public async Task <IActionResult> GetConcreteResource(
            [FromQuery] QueryStringParameters queryStringParametersDto)
        {
            Parameters parameters =
                _parametersProcessorService.ProcessParameters(Request.RouteValues, Request.QueryString);
            string?query = _sparqlFactoryService.GetFinalSelectQueryForResource(parameters);

            if (query != null)
            {
                var sparqlResults = await _endpointService.ExecuteSelectSparqlQueryAsync(
                    parameters.RouteParameters.Endpoint,
                    parameters.RouteParameters.Graph, query);

                if (sparqlResults != null)
                {
                    ResourceVm resourceVm = _resultFormatterService.FormatSparqlResultToResourceDetail(sparqlResults);
                    return(Ok(resourceVm));
                }
            }

            return(NotFound(new CustomErrorVm()
            {
                CustomErrorMessage = "No results were found!",
                GeneratedQuery = query
            }));
        }
        public async Task <IActionResult> PutResource([FromBody] ResourceVm resourceVm)
        {
            Parameters parameters =
                _parametersProcessorService.ProcessParameters(Request.RouteValues, Request.QueryString);
            string?query = _sparqlFactoryService.GetFinalPutQueryForResource(parameters, resourceVm);

            if (query != null)
            {
                bool successful = await _endpointService.ExecuteUpdateSparqlQueryAsync(
                    parameters.RouteParameters.Endpoint,
                    parameters.RouteParameters.Graph, query);

                if (successful)
                {
                    return(Created(new Uri(Request.GetEncodedUrl()), resourceVm));
                }
            }

            return(BadRequest(new ValidationErrorVm()
            {
                CustomError = new CustomErrorVm()
                {
                    CustomErrorMessage =
                        $"Resource could not have been created! Check selected endpoint configuration at {UrlHelperClass.GetEndpointUrl(Request.GetEncodedUrl())}.",
                    GeneratedQuery = query
                }
            }));
        }
Beispiel #3
0
        public string?GetFinalPutQueryForResource(Parameters parameters, ResourceVm resourceVm)
        {
            string resourceCurie = parameters.RouteParameters.Resource;

            if (_namespaceFactoryService.GetAbsoluteUriFromQname(resourceCurie, out string resourceAbsoluteUri))
            {
                SparqlParameterizedString sparqlParameterizedDeleteQuery = new();
                sparqlParameterizedDeleteQuery.CommandText = "DELETE {@sub ?p ?o} WHERE {@sub ?p ?o} ";
                sparqlParameterizedDeleteQuery.SetUri("sub", new Uri(resourceAbsoluteUri));
                string?deleteQuery = sparqlParameterizedDeleteQuery.ToString();
                string?insertQuery = ConstructInsertResourceQueryString(resourceVm, resourceAbsoluteUri);
                if (string.IsNullOrEmpty(insertQuery))
                {
                    return(null);
                }
                deleteQuery = ImplementFromGraphClauseToInsertDeleteQuery(deleteQuery, parameters);
                if (string.IsNullOrEmpty(deleteQuery))
                {
                    return(null);
                }
                string finalQuery = deleteQuery + insertQuery;
                return(finalQuery);
            }

            return(null);
        }
Beispiel #4
0
        private string?ConstructInsertResourceQueryString(ResourceVm resourceVm, string resourceAbsoluteUri)
        {
            SparqlParameterizedString sparqlParameterizedInsertQuery = new();

            sparqlParameterizedInsertQuery.CommandText = "INSERT DATA {@sub @pred @obj";
            string?insertQuery = null;

            sparqlParameterizedInsertQuery.SetUri("sub", new Uri(resourceAbsoluteUri));
            SparqlParameterizedString sparqlParameterizedInsertSubQuery = new();

            sparqlParameterizedInsertSubQuery.CommandText = "; @pred @obj";
            foreach (var propertyName in resourceVm.Predicates.Keys)
            {
                if (_namespaceFactoryService.GetAbsoluteUriFromQname(propertyName, out string predAbsoluteUri))
                {
                    PredicateContent propertyContent = resourceVm.Predicates[propertyName];
                    insertQuery += PopulateInsertQueryString(propertyContent,
                                                             sparqlParameterizedInsertQuery, sparqlParameterizedInsertSubQuery,
                                                             resourceAbsoluteUri, predAbsoluteUri);
                    if (string.IsNullOrEmpty(insertQuery))
                    {
                        return(null);
                    }
                    insertQuery += "} ";
                }
                else
                {
                    return(null);
                }
            }

            return(insertQuery);
        }
Beispiel #5
0
        public async Task TestPutResourceEndpoint_ShouldRBadRequest(string endpoint, string graph,
                                                                    string resourceCurie, string predicateCurie)
        {
            ResourceVm resourceVm = new ResourceVm()
            {
                Predicates = new Dictionary <string, PredicateContent>()
                {
                    {
                        predicateCurie,
                        new PredicateContent()
                        {
                            Curies = new List <string>()
                            {
                                "ex:newCurie"
                            },
                        }
                    }
                }
            };
            var response =
                await TestClient.PutAsJsonAsync(ApiRoutes.NamedGraphResourcesConcreteResource
                                                .Replace("{endpoint}", endpoint)
                                                .Replace("{graph}", graph).Replace("{resource:regex(.+:.+)}", resourceCurie), resourceVm);

            Assert.Equal(HttpStatusCode.BadRequest, response.StatusCode);
        }
Beispiel #6
0
        public async Task <ActionResult> Detail(int id)
        {
            var retVal = new ResourceVm
            {
                Success = false,
                Message = ""
            };

            if (id <= 0)
            {
                retVal.Message = "Please provide an id.";
                return(PartialView("Partial/_resourceDetailsPartial", retVal));
            }

            var result = await _resourceService.FindAsync(id);

            if (result != null)
            {
                retVal.Success = true;

                if (Request.IsAjaxRequest())
                {
                    retVal.Resource = result.ConvertToViewModel();
                }
            }
            else
            {
                retVal.Message = "Item with requested Id was not found.";
            }

            return(PartialView("Partial/_resourceDetailsPartial", retVal));
        }
Beispiel #7
0
        public ActionResult Edit(int?id)
        {
            var retVal = new ResourceVm
            {
                Success = false,
                Message = ""
            };

            if (id <= 0)
            {
                retVal.Message = "Please provide an id.";
                // return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
                return(PartialView("Partial/_resourceEditPartial", retVal));
            }

            var result = _resourceService.Find(id);

            if (result != null)
            {
                retVal.Success  = true;
                retVal.Resource = result.ConvertToViewModel();
            }
            else
            {
                retVal.Message = "Item with requested Id was not found.";
            }

            return(PartialView("Partial/_resourceEditPartial", retVal));
        }
Beispiel #8
0
        private void UpdateResource()
        {
            if (_resVm == null)
            {
                Assert.Fail("UpdateResource: Test Failed to create a new manager.");
            }

            var dbEdited = _resVm;

            dbEdited.Name = "Test Manager Edited";

            var dbRes = ManagerSvc.UpdateResource(dbEdited);

            _resVm = dbRes.Resource;

            Assert.IsTrue(dbRes.IsSuccess);
        }
        /*TODO : MAKE SURE THAT ALL THE TRANSACTION ON SET ARE LOGGED IN A TABLE*/

        /// <summary>
        /// Create a new Resource Manager
        /// </summary>
        /// <param name="name">Resource Name</param>
        /// <param name="type">Resource Type</param>
        /// <param name="settings">Settings</param>
        /// <returns><![CDATA[ (ResourceVm Resource, ResourceSettingsVm Settings) ]]></returns>
        public (ResourceVm Resource, ResourceSettingsVm Settings, bool IsSuccess, String Message) Create(string name, ResourceType type, ResourceSettingsVm settings)
        {
            try
            {
                // Check if the claim already exists
                var dbCheck = ResourceDataAccess.ResourceClaim.Find(f => f.ClaimName.ToLower() == name.ToLower());
                if (dbCheck != null)
                {
                    return(null, null, false, ResourceManagerMessages.Error.RESOURCE_ALREADY_EXISTS);
                }

                // Create the Resource
                var dbView = (new ResourceVm()
                {
                    Name = name
                }).ToEntityCreate(type);
                dbView = ResourceDataAccess.ResourceManager.Create(dbView);

                // Create the Resource Settings
                var dbSettings = settings.ToEntityCreate(dbView);
                dbSettings = ResourceDataAccess.ResourceSettings.Create(dbSettings);

                ResourceDataAccess.Save();

                var res = new ResourceVm(dbView);
                settings = new ResourceSettingsVm(dbSettings);

                return(res, settings, true, ResourceManagerMessages.Success.RESOURCE_CREATED);
            }
            catch (DbEntityValidationException ex)
            {
#if (DEBUG)
                // for debuging entity framework
                foreach (var error in ex.EntityValidationErrors.SelectMany(valError => valError.ValidationErrors))
                {
                    Console.WriteLine(error.ErrorMessage);
                }
#endif
                throw;
            }
            catch
            {
                throw;
            }
        }
        /// <summary>
        /// Update an existing resource
        /// </summary>
        /// <param name="resource">ResourceVm</param>
        /// <returns><![CDATA[ (ResourceVm Resource, bool IsSuccess, String Message) ]]></returns>
        public (ResourceVm Resource, bool IsSuccess, String Message) UpdateResource(ResourceVm resource)
        {
            // Check and make sure that the data exisits.
            var dbRes = ResourceDataAccess.ResourceManager.GetById(resource.Id);

            if (dbRes == null)
            {
                return(null, false, ResourceManagerMessages.Error.RESOURCE_NOT_FOUND);
            }

            // Update the resource manager.
            dbRes = resource.ToEntity(dbRes);
            ResourceDataAccess.ResourceManager.Update(dbRes);
            ResourceDataAccess.Save();

            resource = new ResourceVm(dbRes);
            return(resource, true, ResourceManagerMessages.Success.RESOUCE_UPDATED);
        }
Beispiel #11
0
        private void CreateManager()
        {
            #region Set Settings

            var dbSettings = new ResourceSettingsVm()
            {
                Status = ResourceStatus.Pending
            };

            #endregion Set Settings

            var dbRes = ManagerSvc.Create("Test Manager", ResourceType.Member, dbSettings);

            _resVm         = dbRes.Resource;
            _resSettingsVm = dbRes.Settings;

            Assert.IsTrue(dbRes.IsSuccess);
        }
Beispiel #12
0
        public async Task TestPutResourceEndpoint_ShouldReturnCreated(string endpoint, string graph,
                                                                      string resourceCurie)
        {
            ResourceVm resourceVm = new ResourceVm()
            {
                Predicates = new Dictionary <string, PredicateContent>()
                {
                    {
                        "ex:newProperty",
                        new PredicateContent()
                        {
                            Curies = new List <string>()
                            {
                                "ex:newCurie"
                            },
                        }
                    }
                }
            };
            //Resource exists
            var responseOnGetNotYetModifiedResource = await TestClient.GetAsync(ApiRoutes
                                                                                .NamedGraphResourcesConcreteResource
                                                                                .Replace("{endpoint}", endpoint)
                                                                                .Replace("{graph}", graph).Replace("{resource:regex(.+:.+)}", resourceCurie));

            Assert.Equal(HttpStatusCode.OK, responseOnGetNotYetModifiedResource.StatusCode);

            //Resource modified
            var response =
                await TestClient.PutAsJsonAsync(ApiRoutes.NamedGraphResourcesConcreteResource
                                                .Replace("{endpoint}", endpoint)
                                                .Replace("{graph}", graph).Replace("{resource:regex(.+:.+)}", resourceCurie), resourceVm);

            Assert.Equal(HttpStatusCode.Created, response.StatusCode);

            //Modified resource confirmation
            var recreatedResource = await TestClient.GetAsync(ApiRoutes.NamedGraphResourcesConcreteResource
                                                              .Replace("{endpoint}", endpoint)
                                                              .Replace("{graph}", graph).Replace("{resource:regex(.+:.+)}", resourceCurie)).Result.Content
                                    .ReadAsAsync <ResourceVm>();

            Assert.True(recreatedResource.Predicates.ContainsKey("ex:newProperty"));
        }
Beispiel #13
0
        public async Task <ActionResult> Edit([Bind(Include = "Id, Name, Description, Active, ActiveFrom, ActiveTo")] ApplicationResource resource)
        {
            // https://stackoverflow.com/questions/39533599/mvc-5-with-bootstrap-modal-from-partial-view-validation-not-working
            // https://stackoverflow.com/questions/2845852/asp-net-mvc-how-to-convert-modelstate-errors-to-json
            var retVal = new ResourceVm
            {
                Success = false,
                Message = ""
            };

            if (ModelState.IsValid)
            {
                var repo = _unitOfWorkAsync.RepositoryAsync <ApplicationResource>();

                var valid = resource.Validate();

                try
                {
                    repo.Update(resource);

                    var result = await _unitOfWorkAsync.SaveChangesAsync();

                    if (result > 0)
                    {
                        retVal.Success = true;
                    }
                }
                catch (Exception e)
                {
                    Console.WriteLine(e);
                    Debug.WriteLine(e);
                    retVal.Message = e.Message;
                }
            }
            else
            {
                retVal.FormErrors = ModelState.Select(kvp => new { key = kvp.Key, errors = kvp.Value.Errors.Select(e => e.ErrorMessage) });
                retVal.Message    = "Model state invalid";
            }

            return(PartialView("Partial/_resourceEditPartial", retVal));
        }
        public ResourceVm FormatSparqlResultToResourceDetail(IEnumerable <SparqlResult> sparqlResults)
        {
            ResourceVm resourceVm = new ResourceVm()
            {
                Predicates = new Dictionary <string, PredicateContent>()
            };

            foreach (var sparqlResult in sparqlResults)
            {
                string property = sparqlResult.Value("p").ToString();
                if (!_namespaceFactoryService.GetQnameFromAbsoluteUri(property, out var propertyQname))
                {
                    continue;
                }
                if (!resourceVm.Predicates.ContainsKey(propertyQname))
                {
                    resourceVm.Predicates.Add(propertyQname, new PredicateContent());
                }
                string obj = sparqlResult.Value("o").ToString();
                if (CheckIfValueIsLiteral(obj, propertyQname, out Literal literal))
                {
                    if (resourceVm.Predicates[propertyQname].Literals == null)
                    {
                        resourceVm.Predicates[propertyQname].Literals = new List <Literal>();
                    }
                    resourceVm.Predicates[propertyQname].Literals.Add(literal);
                }
                else
                {
                    if (_namespaceFactoryService.GetQnameFromAbsoluteUri(obj, out var objQname))
                    {
                        if (resourceVm.Predicates[propertyQname].Curies == null)
                        {
                            resourceVm.Predicates[propertyQname].Curies = new List <string>();
                        }
                        resourceVm.Predicates[propertyQname].Curies.Add(HttpUtility.UrlDecode(objQname));
                    }
                }
            }

            return(resourceVm);
        }
        public async Task TestPostResourceEndpoint_ShouldReturnCreated(string endpoint, string graph, string resourceCurie)
        {
            NamedResourceVm resourceVm = new NamedResourceVm()
            {
                ResourceCurie = resourceCurie,
                Predicates    = new Dictionary <string, PredicateContent>()
                {
                    {
                        "ex:examplePredicate",
                        new PredicateContent()
                        {
                            Curies = new List <string>()
                            {
                                "ex:curie1", "ex:curie2", "ex:curie3"
                            },
                            Literals = new List <Literal>()
                            {
                                new() { Value = "Example language text...", Language = "en" },
                                new() { Value = "2021-03-02T20:00:00-01:00", Datatype = "xsd:dateTime" },
                                new() { Value = "String value" }
                            }
                        }
                    }
                }
            };
            var response = await TestClient.PostAsJsonAsync(
                ApiRoutes.NamedGraphResources.Replace("{endpoint}", endpoint)
                .Replace("{graph}", graph), resourceVm);

            ResourceVm createdResource = await TestClient.GetAsync(ApiRoutes.NamedGraphResourcesConcreteResource
                                                                   .Replace("{endpoint}", endpoint)
                                                                   .Replace("{graph}", graph)
                                                                   .Replace("{resource:regex(.+:.+)}", resourceCurie)).Result.Content.ReadAsAsync <ResourceVm>();

            Assert.Contains("ex:examplePredicate", createdResource.Predicates.Keys);
            Assert.True(createdResource.Predicates.Values.First().Curies.Count() == 3);
            Assert.True(createdResource.Predicates.Values.First().Literals.Count() == 3);
            //Possibly additional checks on returned object which should same as NamedResourceObjectAbove
            Assert.Equal(HttpStatusCode.Created, response.StatusCode);
        }