cyberhybridhub/server/lib/spelling/spelling_question_links_db.dart
nathanAndrinoid a7c370b743
Some checks failed
Admin portal tests / test (push) Has been cancelled
Fix database connection pooling and UI question filtering
- Replaced single Postgres Connection with Pool across the server to prevent runTx locking
- Added _filterForEnabledSources to client's _fetchUnansweredForPanel to strictly enforce local configuration

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-05 22:04:06 +00:00

62 lines
1.6 KiB
Dart

import 'package:postgres/postgres.dart';
/// Per-question link between a user, quiz row, and shared spelling item.
class SpellingQuestionLinksDb {
SpellingQuestionLinksDb(this._connection);
final Pool _connection;
/// Creates a link when the spelling tile loads; idempotent per [questionId].
Future<void> linkQuestion({
required String questionId,
required String firebaseUid,
required String spellingItemId,
}) async {
await _connection.execute(
Sql.named(
'''
INSERT INTO spelling_question_links (
question_id, firebase_uid, spelling_item_id
) VALUES (
@question_id::uuid, @uid, @item_id::uuid
)
ON CONFLICT (question_id) DO NOTHING
''',
),
parameters: <String, dynamic>{
'question_id': questionId,
'uid': firebaseUid,
'item_id': spellingItemId,
},
);
}
/// Removes every quiz-to-item link for [firebaseUid].
Future<void> deleteAllForUser(String firebaseUid) async {
await _connection.execute(
Sql.named(
'''
DELETE FROM spelling_question_links
WHERE firebase_uid = @uid
''',
),
parameters: <String, dynamic>{'uid': firebaseUid},
);
}
Future<bool> hasLink(String questionId) async {
final Result result = await _connection.execute(
Sql.named(
'''
SELECT 1
FROM spelling_question_links
WHERE question_id = @question_id::uuid
LIMIT 1
''',
),
parameters: <String, dynamic>{'question_id': questionId},
);
return result.isNotEmpty;
}
}