-- Security Task Read By UserId Status
-- Stored Procedure: ReadByUserIdStatus
CREATE OR ALTER PROCEDURE [dbo].[SecurityTask_ReadByUserIdStatus]
    @UserId UNIQUEIDENTIFIER,
    @Status TINYINT = NULL
AS
BEGIN
    SET NOCOUNT ON

    SELECT
        ST.Id,
        ST.OrganizationId,
        ST.CipherId,
        ST.Type,
        ST.Status,
        ST.CreationDate,
        ST.RevisionDate
    FROM
        [dbo].[SecurityTaskView] ST
    INNER JOIN
        [dbo].[OrganizationUserView] OU ON OU.[OrganizationId] = ST.[OrganizationId]
    INNER JOIN
        [dbo].[Organization] O ON O.[Id] = ST.[OrganizationId]
    LEFT JOIN
        [dbo].[CipherView] C ON C.[Id] = ST.[CipherId]
    LEFT JOIN
        [dbo].[CollectionCipher] CC ON CC.[CipherId] = C.[Id] AND C.[Id] IS NOT NULL
    LEFT JOIN
        [dbo].[CollectionUser] CU ON CU.[CollectionId] = CC.[CollectionId] AND CU.[OrganizationUserId] = OU.[Id] AND C.[Id] IS NOT NULL
    LEFT JOIN
        [dbo].[GroupUser] GU ON GU.[OrganizationUserId] = OU.[Id] AND CU.[CollectionId] IS NULL AND C.[Id] IS NOT NULL
    LEFT JOIN
        [dbo].[CollectionGroup] CG ON CG.[GroupId] = GU.[GroupId] AND CG.[CollectionId] = CC.[CollectionId]
    WHERE
        OU.[UserId] = @UserId
        AND OU.[Status] = 2 -- Ensure user is confirmed
        AND O.[Enabled] = 1
        AND (
            ST.[CipherId] IS NULL
            OR (
                C.[Id] IS NOT NULL
                AND (
                    CU.[ReadOnly] = 0
                    OR CG.[ReadOnly] = 0
                )
            )
        )
        AND ST.[Status] = COALESCE(@Status, ST.[Status])
    GROUP BY
        ST.Id,
        ST.OrganizationId,
        ST.CipherId,
        ST.Type,
        ST.Status,
        ST.CreationDate,
        ST.RevisionDate
    ORDER BY ST.[CreationDate] DESC
END
GO