aboutsummaryrefslogtreecommitdiffhomepage
path: root/src/server/repositories
diff options
context:
space:
mode:
authorClaude <noreply@anthropic.com>2026-02-21 06:57:15 +0000
committerClaude <noreply@anthropic.com>2026-02-21 06:57:15 +0000
commita94aeb6c35a97410ddcb14bb589ce2ab1e3fc125 (patch)
tree656f7f00f2683a2570dc60c52e3256a0c2b69ad1 /src/server/repositories
parent7a77e72bb49ed3990a0c4581292a37a8a4f35231 (diff)
downloadkioku-claude/allow-delete-card-fields-auoeV.tar.gz
kioku-claude/allow-delete-card-fields-auoeV.tar.zst
kioku-claude/allow-delete-card-fields-auoeV.zip
feat: allow deleting card type fields with values via two-step confirmationclaude/allow-delete-card-fields-auoeV
Previously, fields with existing values could not be deleted at all. Now, when a user tries to delete such a field, a two-step confirmation dialog is shown. The first step warns the user with the number of cards using that card type. The second step asks for final confirmation since the action cannot be undone. The backend now accepts a `force=true` query parameter to bypass the field-has-values check, and returns the card count in the 409 response for the frontend to display. https://claude.ai/code/session_017S5QP6SnC5GFNJwQFyT4as
Diffstat (limited to 'src/server/repositories')
-rw-r--r--src/server/repositories/noteType.test.ts1
-rw-r--r--src/server/repositories/noteType.ts18
-rw-r--r--src/server/repositories/types.ts1
3 files changed, 20 insertions, 0 deletions
diff --git a/src/server/repositories/noteType.test.ts b/src/server/repositories/noteType.test.ts
index fdb9d5c..3fd9e7d 100644
--- a/src/server/repositories/noteType.test.ts
+++ b/src/server/repositories/noteType.test.ts
@@ -66,6 +66,7 @@ function createMockNoteTypeRepo(): NoteTypeRepository {
update: vi.fn(),
softDelete: vi.fn(),
hasNotes: vi.fn(),
+ countCards: vi.fn(),
};
}
diff --git a/src/server/repositories/noteType.ts b/src/server/repositories/noteType.ts
index 06c8834..89cf6fd 100644
--- a/src/server/repositories/noteType.ts
+++ b/src/server/repositories/noteType.ts
@@ -143,6 +143,24 @@ export const noteTypeRepository: NoteTypeRepository = {
return result.length > 0;
},
+
+ async countCards(noteTypeId: string): Promise<number> {
+ const { cards } = await import("../db/schema.js");
+
+ const result = await db
+ .select({ count: sql<number>`cast(count(*) as int)` })
+ .from(cards)
+ .innerJoin(notes, eq(cards.noteId, notes.id))
+ .where(
+ and(
+ eq(notes.noteTypeId, noteTypeId),
+ isNull(notes.deletedAt),
+ isNull(cards.deletedAt),
+ ),
+ );
+
+ return Number(result[0]?.count ?? 0);
+ },
};
export const noteFieldTypeRepository: NoteFieldTypeRepository = {
diff --git a/src/server/repositories/types.ts b/src/server/repositories/types.ts
index 7e0819a..27a12b4 100644
--- a/src/server/repositories/types.ts
+++ b/src/server/repositories/types.ts
@@ -250,6 +250,7 @@ export interface NoteTypeRepository {
): Promise<NoteType | undefined>;
softDelete(id: string, userId: string): Promise<boolean>;
hasNotes(id: string, userId: string): Promise<boolean>;
+ countCards(noteTypeId: string): Promise<number>;
}
export interface NoteFieldTypeRepository {