public/Add-Book.ps1
|
function Add-Book { <# .SYNOPSIS Adds a book to the Bookworm database. .DESCRIPTION Inserts book metadata into the Books table. Uses INSERT OR REPLACE to handle duplicates. .PARAMETER ISBN The ISBN of the book (unique identifier). .PARAMETER Title The title of the book. .PARAMETER PublishDate The publication date. .PARAMETER Publishers The publisher(s) of the book. .PARAMETER NumberOfPages The number of pages in the book. .PARAMETER CoverUrl URL to the book's cover image. .PARAMETER ScannedAt The timestamp when the book was scanned. .PARAMETER DatabasePath Path to the SQLite database file. Defaults to module data directory. .EXAMPLE $metadata = Get-BookMetadata -ISBN '9780134685991' Add-Book @metadata #> [CmdletBinding()] Param( [Parameter(Mandatory, ValueFromPipelineByPropertyName)] [string] $ISBN, [Parameter(Mandatory, ValueFromPipelineByPropertyName)] [string] $Title, [Parameter(ValueFromPipelineByPropertyName)] [string] $PublishDate, [Parameter(ValueFromPipelineByPropertyName)] [string] $Publishers, [Parameter(ValueFromPipelineByPropertyName)] [int] $NumberOfPages, [Parameter(ValueFromPipelineByPropertyName)] [string] $CoverUrl, [Parameter(ValueFromPipelineByPropertyName)] [string] $FirstSentence, [Parameter(ValueFromPipelineByPropertyName)] [string] $ScannedAt, [Parameter()] [string] $DatabasePath ) process { # Use module-level database path if not provided if (-not $DatabasePath) { $DatabasePath = $script:DatabasePath } try { # Escape single quotes in strings for SQLite $EscapedTitle = $Title -replace "'", "''" $EscapedPublishers = $Publishers -replace "'", "''" $EscapedCoverUrl = if ($CoverUrl) { $CoverUrl -replace "'", "''" } else { '' } $EscapedFirstSentence = if ($FirstSentence) { $FirstSentence -replace "'", "''" } else { '' } $EscapedScannedAt = $ScannedAt -replace "'", "''" $EscapedISBN = $ISBN -replace "'", "''" $EscapedPublishDate = $PublishDate -replace "'", "''" # Use INSERT OR REPLACE to handle duplicates (updates if ISBN exists) $Query = @" INSERT OR REPLACE INTO Books (ISBN, Title, PublishDate, Publishers, NumberOfPages, CoverUrl, FirstSentence, ScannedAt) VALUES ('$EscapedISBN', '$EscapedTitle', '$EscapedPublishDate', '$EscapedPublishers', $NumberOfPages, '$EscapedCoverUrl', '$EscapedFirstSentence', '$EscapedScannedAt') "@ Invoke-UniversalSQLiteQuery -Path $DatabasePath -Query $Query Write-Verbose "Added book to database: $Title (ISBN: $ISBN)" # Return the added book info [PSCustomObject]@{ ISBN = $ISBN Title = $Title PublishDate = $PublishDate Publishers = $Publishers NumberOfPages = $NumberOfPages CoverUrl = $CoverUrl FirstSentence = $FirstSentence ScannedAt = $ScannedAt Status = 'Added' } } catch { Write-Error "Failed to add book to database: $_" throw } } } |