/// <summary> /// Builds and executes the query. /// </summary> /// <param name="context">The request context.</param> /// <param name="arguments">The arguments from which to build the query.</param> /// <param name="repository">The <see cref="IRepository"/>.</param> /// <param name="parser">The <see cref="IQueryParser"/>.</param> /// <returns>Returns the result.</returns> protected override Record Retrieve(IMansionContext context, IPropertyBag arguments, IRepository repository, IQueryParser parser) { // parse the query var query = parser.Parse(context, arguments); // execute the query return repository.RetrieveSingleNode(context, query); }
/// <summary> /// Builds and executes the query. /// </summary> /// <param name="context">The request context.</param> /// <param name="arguments">The arguments from which to build the query.</param> /// <param name="repository">The <see cref="IRepository"/>.</param> /// <param name="parser">The <see cref="IQueryParser"/>.</param> /// <returns>Returns the result.</returns> protected override Record Retrieve(IMansionContext context, IPropertyBag arguments, IRepository repository, IQueryParser parser) { // parse the query var query = parser.Parse(context, arguments); // make sure a child of clause is specified if (!query.HasSpecification<ChildOfSpecification>()) throw new InvalidOperationException("The parent node was not specified."); // execute the query return repository.RetrieveSingleNode(context, query); }
/// <summary> /// Builds and executes the query. /// </summary> /// <param name="context">The request context.</param> /// <param name="arguments">The arguments from which to build the query.</param> /// <param name="repository">The <see cref="IRepository"/>.</param> /// <param name="parser">The <see cref="IQueryParser"/>.</param> /// <returns>Returns the result.</returns> protected override Record Retrieve(IMansionContext context, IPropertyBag arguments, IRepository repository, IQueryParser parser) { // get the node var contentNode = GetRequiredAttribute<Node>(context, "source"); // get the page type var pageType = typeService.Load(context, "Page"); // find the closest node pointer of type Page var pageNodePointer = contentNode.Pointer.HierarchyReverse.FirstOrDefault(x => typeService.Load(context, x.Type).IsAssignable(pageType)); if (pageNodePointer == null) throw new InvalidOperationException(string.Format("Node '{0}' does not have a parent which is a Page", contentNode.Pointer.StructureString)); // retrieve and return the parent node return repository.RetrieveSingleNode(context, new PropertyBag {{"id", pageNodePointer.Id}}); }
/// <summary> /// Builds and executes the query. /// </summary> /// <param name="context">The <see cref="IMansionContext"/>.</param> /// <param name="arguments">The arguments from which to build the query.</param> /// <param name="repository">The <see cref="IRepository"/>.</param> /// <param name="parser">The <see cref="IQueryParser"/>.</param> /// <returns>Returns the result.</returns> protected override Record Retrieve(IMansionContext context, IPropertyBag arguments, IRepository repository, IQueryParser parser) { // get the url Url url; if (!arguments.TryGet(context, "url", out url)) url = context.Cast<IMansionWebContext>().Request.RequestUrl; // parse the query var query = parser.Parse(context, new PropertyBag { {"baseType", "Site"}, {"hostHeaders", url.HostName} }); // execute the query return repository.RetrieveSingleNode(context, query); }
/// <summary> /// Builds and executes the query. /// </summary> /// <param name="context">The request context.</param> /// <param name="arguments">The arguments from which to build the query.</param> /// <param name="repository">The <see cref="IRepository"/>.</param> /// <param name="parser">The <see cref="IQueryParser"/>.</param> /// <returns>Returns the result.</returns> protected override Record Retrieve(IMansionContext context, IPropertyBag arguments, IRepository repository, IQueryParser parser) { // parse the query var query = parser.Parse(context, arguments); // make sure a child of clause is specified var parentOfSpecifications = query.Components.OfType<SpecificationQueryComponent>().Select(component => component.Specification).OfType<ParentOfSpecification>().ToArray(); if (!parentOfSpecifications.Any()) throw new InvalidOperationException("The child node was not specified."); // if there is a parent of specification for depth 0 it means a parent of the root node is queried, which does not exist if (parentOfSpecifications.Any(candidate => candidate.ChildPointer.Depth == 1)) return null; // execute the query return repository.RetrieveSingleNode(context, query); }
/// <summary> /// Builds and executes the query. /// </summary> /// <param name="context">The <see cref="IMansionContext"/>.</param> /// <param name="arguments">The arguments from which to build the query.</param> /// <param name="repository">The <see cref="IRepository"/>.</param> /// <param name="parser">The <see cref="IQueryParser"/>.</param> /// <returns>Returns the result.</returns> protected override Record Retrieve(IMansionContext context, IPropertyBag arguments, IRepository repository, IQueryParser parser) { // get the url Url url; if (!arguments.TryGet(context, "url", out url)) url = context.Cast<IMansionWebContext>().Request.RequestUrl; // parse the URL for identifiers IPropertyBag queryAttributes; if (!nodeUrlService.TryExtractQueryParameters(context.Cast<IMansionWebContext>(), url, out queryAttributes)) return null; // parse the query var query = parser.Parse(context, queryAttributes); // execute the query return repository.RetrieveSingleNode(context, query); }
/// <summary> /// Retrieves the role owner node. /// </summary> /// <param name="context"></param> /// <param name="owner"></param> /// <param name="repository"></param> /// <returns></returns> private static Node RetrieveRoleOwnerNode(IMansionContext context, RoleOwner owner, IRepository repository) { // if the user is not authenticated, retrieve the visiter from the database Node node; if (owner.Id == Guid.Empty) { node = repository.RetrieveSingleNode(context, new PropertyBag { {"baseType", "RoleOwner"}, {"key", "AnonymousUser"}, {"bypassAuthorization", true}, {StorageOnlyQueryComponent.PropertyKey, true} }); if (node == null) throw new InvalidOperationException("Could not find the anonymous user node"); } else { node = repository.RetrieveSingleNode(context, new PropertyBag { {"baseType", "RoleOwner"}, {"guid", owner.Id}, {"bypassAuthorization", true}, {StorageOnlyQueryComponent.PropertyKey, true} }); if (node == null) throw new InvalidOperationException(string.Format("Could not find role owner with foreign ID {0} in repository, please sync tables", owner.Id)); } return node; }
/// <summary> /// Retrieves the role node. /// </summary> /// <param name="context"></param> /// <param name="role"></param> /// <param name="repository"></param> /// <returns></returns> private static Node RetrieveRoleNode(IMansionContext context, Role role, IRepository repository) { var node = repository.RetrieveSingleNode(context, new PropertyBag { {"baseType", "Role"}, {"guid", role.Id}, {"bypassAuthorization", true}, {StorageOnlyQueryComponent.PropertyKey, true} }); if (node == null) throw new InvalidOperationException(string.Format("Could not find role with ID {0} in repository, please sync tables", role.Id)); return node; }