Functions/GenXdev.Data.KeyValueStore/Remove-KeyValueStore.ps1

################################################################################
<#
.SYNOPSIS
Removes a key-value store from the database.
 
.DESCRIPTION
Removes all entries for a specified store from the database. For local stores,
performs a physical delete. For synchronized stores, marks entries as deleted and
triggers synchronization.
 
.PARAMETER StoreName
The name of the key-value store to remove.
 
.PARAMETER SynchronizationKey
The synchronization scope identifier. Defaults to "Local" for non-synchronized
stores.
 
.EXAMPLE
Remove-KeyValueStore -StoreName "ConfigurationStore" -SynchronizationKey "Cloud"
#>

function Remove-KeyValueStore {

    [CmdletBinding()]

    param (
        ########################################################################
        [Parameter(
            Mandatory = $true,
            Position = 0,
            HelpMessage = "Name of the store to delete"
        )]
        [string]$StoreName,
        ########################################################################
        [Parameter(
            Mandatory = $false,
            Position = 1,
            HelpMessage = "Key to identify synchronization scope"
        )]
        [string]$SynchronizationKey = "Local"
        ########################################################################
    )

    begin {

        # get the full path to the sqlite database file
        $databaseFilePath = Expand-Path `
            "$PSScriptRoot\..\..\..\..\GenXdev.Local\KeyValueStores.sqllite.db" `
            -CreateDirectory

        Write-Verbose "Using database at: $databaseFilePath"
    }

    process {

        # ensure database exists, create if not
        if (-not (Test-Path $databaseFilePath)) {

            Write-Verbose "Database not found, initializing new database"
            Initialize-KeyValueStores
        }

        # get current user identity for audit trail
        $lastModifiedBy = "$env:COMPUTERNAME\$env:USERNAME"
        Write-Verbose "Operation performed by: $lastModifiedBy"

        # determine sql operation based on synchronization mode
        if ($SynchronizationKey -eq "Local") {

            Write-Verbose "Local store: performing physical delete"
            $sqlQuery = @"
DELETE FROM KeyValueStore
WHERE storeName = @storeName
AND synchronizationKey = @syncKey;
"@

        }
        else {

            Write-Verbose "Sync store: marking entries as deleted"
            $sqlQuery = @"
UPDATE KeyValueStore
SET deletedDate = CURRENT_TIMESTAMP,
    lastModified = CURRENT_TIMESTAMP,
    lastModifiedBy = @modifiedBy
WHERE storeName = @storeName
AND synchronizationKey = @syncKey;
"@

        }

        # prepare parameters for sql query
        $params = @{
            'storeName'  = $StoreName
            'syncKey'    = $SynchronizationKey
            'modifiedBy' = $lastModifiedBy
        }

        # execute the database operation
        Write-Verbose "Executing database operation for store: $StoreName"
        Invoke-SQLiteQuery `
            -DatabaseFilePath $databaseFilePath `
            -Queries $sqlQuery `
            -SqlParameters $params

        # trigger synchronization for non-local stores
        if ($SynchronizationKey -ne "Local") {

            Write-Verbose "Triggering synchronization for key: $SynchronizationKey"
            Sync-KeyValueStore -SynchronizationKey $SynchronizationKey
        }
    }

    end {
    }
}
################################################################################