fnUserSearchablePages

Return

Return Type
table

Parameters

Parameter Parameter Type Mode Description
@ClientsID int IN
@ClientUsersID int IN
@SiteContentFilter int IN
@PageContentFilter int IN
@CurrentDate datetime IN

Definition

Copy

            CREATE   FUNCTION [dbo].[fnUserSearchablePages]
                (@ClientsID int, @ClientUsersID int, @SiteContentFilter int, @PageContentFilter int, @CurrentDate datetime)
            RETURNS @UserSearchableParts TABLE (
                PageContentID int,
                PageID int,
                SiteContentID int,
                PageName nvarchar(255)
            )AS
            BEGIN
                DECLARE @TemplateSecurity table(ObjectGuid uniqueidentifier PRIMARY KEY, [ID] int)
                DECLARE @PageSecurity table(ObjectGuid uniqueidentifier PRIMARY KEY, [ID] int, TemplatePageID int, PageName nvarchar(255) COLLATE database_default)
                DECLARE @SiteContentSecurity table(ObjectGuid uniqueidentifier PRIMARY KEY, [ID] int) --Part Security

                DECLARE @TargetedPartsSecurity table (PartOrder int, PageContentID int, PageID int, SiteContentID int, PageName nvarchar(255))

                IF @SiteContentFilter <= 0
                    SET @SiteContentFilter = null
                IF @PageContentFilter <= 0
                    SET @PageContentFilter = null

                --Determine the Templates the user can view

                INSERT INTO @TemplateSecurity
                SELECT ts.ObjectGuid, t.ID
                FROM dbo.fnUserPrivs(@ClientUsersID,@ClientsID,3) ts
                INNER JOIN sitepages t on t.guid = ts.ObjectGUID and t.IsTemplatePage = 1
                WHERE ts.canView = 1

                --Determine the Pages the user can view

                INSERT INTO @PageSecurity
                SELECT ps.ObjectGuid, p.ID, p.TemplatePageID, p.PageName
                FROM dbo.fnUserPrivs(@ClientUsersID,@ClientsID,2) ps
                INNER JOIN sitepages p on p.guid = ps.ObjectGUID and p.IsTemplatePage = 0
                WHERE ps.canView = 1

                --Insert Parts that are indexed in Search

                INSERT INTO @SiteContentSecurity
                SELECT scs.ObjectGuid, sc.id
                FROM dbo.fnUserPrivs(@ClientUsersID,@ClientsID,1) scs
                INNER JOIN sitecontent sc on sc.guid = scs.ObjectGUID AND dbo.fnSiteContentIsPublished(sc.id,@CurrentDate) = 1
                WHERE canView = 1
                AND sc.id IN (SELECT DISTINCT SiteContentID From Search)
                AND isnull(@SiteContentFilter,sc.id) = sc.id

                --Insert TargetedContentParts Parts Are Searchable by the user

                INSERT INTO @SiteContentSecurity
                SELECT distinct scs.ObjectGuid, sc.id
                FROM dbo.fnUserPrivs(@ClientUsersID,@ClientsID,1) scs
                INNER JOIN sitecontent sc on sc.guid = scs.ObjectGUID AND dbo.fnSiteContentIsPublished(sc.id,@CurrentDate) = 1
                INNER JOIN TargetedContentPart [tcp] on tcp.sitecontentid = sc.id
                WHERE canView = 1
                AND sc.ContentTypesID = 66
                AND EXISTS (SELECT *
                FROM @SiteContentSecurity s
                INNER JOIN TargetedContentChecks tcc ON tcc.ContentID = s.ID
                INNER JOIN TargetedContentPart [tcp] ON tcc.TargetedPartID = tcp.ID
                WHERE isnull(@SiteContentFilter,s.id) = s.id
                )
                AND NOT EXISTS (SELECT *
                FROM @SiteContentSecurity s
                WHERE s.ID = sc.ID
                and isnull(@SiteContentFilter,s.id) = s.id
                )


                --Select all TC parts the user has permissions for. Will filter by priority afterwards.

                INSERT INTO @TargetedPartsSecurity
                --Pages that contain a Targeted Content Part That Contain the Part

                SELECT tcc.PartOrder, pc.id, ps.ID, scs.id, ps.PageName
                FROM @SiteContentSecurity scs
                INNER JOIN TargetedContentChecks tcc on tcc.ContentID = scs.ID
                INNER JOIN TargetedContentPart [tcp] on tcp.ID = tcc.TargetedpartID
                INNER JOIN @SiteContentSecurity tcpscs on tcpscs.[ID] = tcp.SiteContentID
                INNER JOIN pagecontent pc on pc.sitecontentid = tcpscs.ID AND isnull(@PageContentFilter,pc.id) = pc.id
                INNER JOIN @PageSecurity ps  on ps.ID = pc.sitepagesid
                INNER JOIN @TemplateSecurity ts  on ts.ID = ps.TemplatePageID
                UNION
                --Pages whose template contain a Targeted Content Part That Contain the Part

                SELECT tcc.PartOrder, pc.id, ps.ID, scs.id, ps.PageName
                FROM @SiteContentSecurity scs
                INNER JOIN TargetedContentChecks tcc on tcc.ContentID = scs.ID
                INNER JOIN TargetedContentPart [tcp] on tcp.ID = tcc.TargetedpartID
                INNER JOIN @SiteContentSecurity tcpscs on tcpscs.[ID] = tcp.SiteContentID
                INNER JOIN pagecontent pc on pc.sitecontentid = tcpscs.ID AND isnull(@PageContentFilter,pc.id) = pc.id
                INNER JOIN @TemplateSecurity ts on ts.[id] = pc.sitepagesid
                INNER JOIN @PageSecurity ps on ps.TemplatePageID = ts.[id]



                INSERT INTO @UserSearchableParts
                --Pages that contain the part

                SELECT pc.id, ps.ID, scs.id, ps.PageName
                FROM @SiteContentSecurity scs
                INNER JOIN pagecontent pc on pc.sitecontentid = scs.ID AND isnull(@PageContentFilter,pc.id) = pc.id
                INNER JOIN @PageSecurity ps  on ps.ID = pc.sitepagesid
                INNER JOIN @TemplateSecurity ts  on ts.ID = ps.TemplatePageID
                UNION
                --Pages whose template contain the part

                SELECT pc.id, ps.ID, scs.id, ps.PageName
                FROM @SiteContentSecurity scs
                INNER JOIN pagecontent pc on pc.sitecontentid = scs.ID AND isnull(@PageContentFilter,pc.id) = pc.id
                INNER JOIN @TemplateSecurity ts on ts.[id] = pc.sitepagesid
                INNER JOIN @PageSecurity ps on ps.TemplatePageID = ts.[id]
                UNION
                --A filtered version of the templates and pages containing targeted content

                SELECT tps.PageContentID, tps.PageID, tps.SiteContentID, tps.PageName
                FROM @TargetedPartsSecurity tps
                INNER JOIN (SELECT min(PartOrder) [PartOrder], PageContentID, PageID FROM @TargetedPartsSecurity GROUP BY PageContentID, PageID) tps2
                on tps.PageContentID=tps2.PageContentID and tps.PartOrder=tps2.PartOrder

            RETURN
            END