From dc86897db40d99f7988a1d766092f74c8513241e Mon Sep 17 00:00:00 2001 From: tcheeric Date: Wed, 26 Nov 2025 16:34:36 +0000 Subject: [PATCH] feat: Persist created key to database in `create_new_key` - Use Prisma to upsert key details upon creation. - Add database mocking for related unit tests. - Ensure `create_new_key` saves keyName and pubkey for future operations. --- .../commands/__tests__/create_new_key.test.ts | 20 ++++++++++++++++++- .../admin/commands/__tests__/test-utils.ts | 1 + src/daemon/admin/commands/create_new_key.ts | 14 +++++++++++++ 3 files changed, 34 insertions(+), 1 deletion(-) diff --git a/src/daemon/admin/commands/__tests__/create_new_key.test.ts b/src/daemon/admin/commands/__tests__/create_new_key.test.ts index d9b7022..1acef12 100644 --- a/src/daemon/admin/commands/__tests__/create_new_key.test.ts +++ b/src/daemon/admin/commands/__tests__/create_new_key.test.ts @@ -1,5 +1,5 @@ import { describe, it, expect, vi, beforeEach } from 'vitest'; -import { createMockAdmin, createMockRequest, getResponseResult, resetMocks } from './test-utils'; +import { createMockAdmin, createMockRequest, getResponseResult, resetMocks, mockPrisma } from './test-utils'; // Mock the saveEncrypted function vi.mock('../../../../commands/add.js', () => ({ @@ -11,6 +11,11 @@ vi.mock('../../../lib/profile.js', () => ({ setupSkeletonProfile: vi.fn(), })); +// Mock the prisma module +vi.mock('../../../../db.js', () => ({ + default: mockPrisma, +})); + import createNewKey from '../create_new_key'; describe('create_new_key', () => { @@ -51,6 +56,19 @@ describe('create_new_key', () => { expect.stringMatching(/^nsec1/) ); + // Verify key was saved to database + expect(mockPrisma.key.upsert).toHaveBeenCalledWith({ + where: { keyName: 'my-key' }, + update: { + pubkey: expect.any(String), + deletedAt: null, + }, + create: { + keyName: 'my-key', + pubkey: expect.any(String), + }, + }); + // Verify response contains npub expect(admin.rpc.sendResponse).toHaveBeenCalledTimes(1); const result = getResponseResult(admin); diff --git a/src/daemon/admin/commands/__tests__/test-utils.ts b/src/daemon/admin/commands/__tests__/test-utils.ts index d730340..1e75d52 100644 --- a/src/daemon/admin/commands/__tests__/test-utils.ts +++ b/src/daemon/admin/commands/__tests__/test-utils.ts @@ -9,6 +9,7 @@ export const mockPrisma = { findMany: vi.fn(), create: vi.fn(), update: vi.fn(), + upsert: vi.fn(), delete: vi.fn(), }, keyUser: { diff --git a/src/daemon/admin/commands/create_new_key.ts b/src/daemon/admin/commands/create_new_key.ts index 49cbba7..857db87 100644 --- a/src/daemon/admin/commands/create_new_key.ts +++ b/src/daemon/admin/commands/create_new_key.ts @@ -4,6 +4,7 @@ import { saveEncrypted } from "../../../commands/add.js"; import { nip19 } from 'nostr-tools'; import { setupSkeletonProfile } from "../../lib/profile.js"; import { bytesToHex, hexToBytes } from "../../../utils/hex.js"; +import prisma from "../../../db.js"; export default async function createNewKey(admin: AdminInterface, req: NDKRpcRequest) { const [ keyName, passphrase, _nsec ] = req.params as [ string, string, string? ]; @@ -35,6 +36,19 @@ export default async function createNewKey(admin: AdminInterface, req: NDKRpcReq await admin.loadNsec(keyName, nsec); + // Also save to database so delete_key can find it + await prisma.key.upsert({ + where: { keyName }, + update: { + pubkey: user.pubkey, + deletedAt: null, // Ensure it's not marked as deleted + }, + create: { + keyName, + pubkey: user.pubkey, + }, + }); + const result = JSON.stringify({ npub: user.npub, });