feat(db): introduce item_claims for quantity-aware claims; supersede inline claim columns
This commit is contained in:
@@ -113,6 +113,25 @@ export async function initializeDatabase() {
|
||||
)
|
||||
`);
|
||||
|
||||
// Create item_claims table
|
||||
sqlite.exec(`
|
||||
CREATE TABLE IF NOT EXISTS item_claims (
|
||||
id TEXT PRIMARY KEY NOT NULL,
|
||||
item_id TEXT NOT NULL,
|
||||
guest_id TEXT NOT NULL,
|
||||
quantity INTEGER DEFAULT 1 NOT NULL,
|
||||
note TEXT,
|
||||
is_purchased INTEGER DEFAULT 0 NOT NULL,
|
||||
claimed_at INTEGER DEFAULT (unixepoch()) NOT NULL,
|
||||
updated_at INTEGER DEFAULT (unixepoch()) NOT NULL,
|
||||
FOREIGN KEY (item_id) REFERENCES wishlist_items(id) ON DELETE CASCADE,
|
||||
FOREIGN KEY (guest_id) REFERENCES guests(id) ON DELETE CASCADE,
|
||||
UNIQUE(item_id, guest_id)
|
||||
)
|
||||
`);
|
||||
sqlite.exec('CREATE INDEX IF NOT EXISTS idx_item_claims_item ON item_claims(item_id)');
|
||||
sqlite.exec('CREATE INDEX IF NOT EXISTS idx_item_claims_guest ON item_claims(guest_id)');
|
||||
|
||||
// Run migrations for existing databases
|
||||
try {
|
||||
const columns = sqlite.pragma('table_info(wishlists)') as Array<{ name: string }>;
|
||||
@@ -157,6 +176,32 @@ export async function initializeDatabase() {
|
||||
}
|
||||
console.log('ℹ️ Legacy claim columns nullified (claimed_by_name / claimed_by_token)');
|
||||
}
|
||||
|
||||
// Move any existing inline claims into item_claims (forward-migration), then nullify the inline columns
|
||||
const itemColsAfter = sqlite.pragma('table_info(wishlist_items)') as Array<{ name: string }>;
|
||||
const stillHasClaimedByGuestId = itemColsAfter.some((c) => c.name === 'claimed_by_guest_id');
|
||||
if (stillHasClaimedByGuestId) {
|
||||
sqlite.exec(`
|
||||
INSERT INTO item_claims (id, item_id, guest_id, quantity, note, is_purchased, claimed_at, updated_at)
|
||||
SELECT
|
||||
lower(hex(randomblob(16))),
|
||||
wi.id,
|
||||
wi.claimed_by_guest_id,
|
||||
1,
|
||||
wi.claimed_by_note,
|
||||
wi.is_purchased,
|
||||
COALESCE(wi.claimed_at, unixepoch()),
|
||||
unixepoch()
|
||||
FROM wishlist_items wi
|
||||
WHERE wi.claimed_by_guest_id IS NOT NULL
|
||||
AND NOT EXISTS (
|
||||
SELECT 1 FROM item_claims ic
|
||||
WHERE ic.item_id = wi.id AND ic.guest_id = wi.claimed_by_guest_id
|
||||
)
|
||||
`);
|
||||
sqlite.exec('UPDATE wishlist_items SET claimed_by_guest_id = NULL, claimed_by_note = NULL, claimed_at = NULL, is_purchased = 0');
|
||||
console.log('ℹ️ Migrated inline claims into item_claims and cleared inline claim columns');
|
||||
}
|
||||
} catch (migrationError) {
|
||||
console.log('Migration already applied or not needed');
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user