feat: add has_notes and notes_preview to session list, omit full notes
Made-with: Cursor
This commit is contained in:
@@ -5,6 +5,7 @@ const db = require('../database');
|
|||||||
const { triggerWebhook } = require('../utils/webhooks');
|
const { triggerWebhook } = require('../utils/webhooks');
|
||||||
const { getWebSocketManager } = require('../utils/websocket-manager');
|
const { getWebSocketManager } = require('../utils/websocket-manager');
|
||||||
const { startMonitor, stopMonitor, getMonitorSnapshot } = require('../utils/ecast-shard-client');
|
const { startMonitor, stopMonitor, getMonitorSnapshot } = require('../utils/ecast-shard-client');
|
||||||
|
const { computeNotesPreview } = require('../utils/notes-preview');
|
||||||
|
|
||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
|
|
||||||
@@ -21,7 +22,11 @@ router.get('/', (req, res) => {
|
|||||||
try {
|
try {
|
||||||
const sessions = db.prepare(`
|
const sessions = db.prepare(`
|
||||||
SELECT
|
SELECT
|
||||||
s.*,
|
s.id,
|
||||||
|
s.created_at,
|
||||||
|
s.closed_at,
|
||||||
|
s.is_active,
|
||||||
|
s.notes,
|
||||||
COUNT(sg.id) as games_played
|
COUNT(sg.id) as games_played
|
||||||
FROM sessions s
|
FROM sessions s
|
||||||
LEFT JOIN session_games sg ON s.id = sg.session_id
|
LEFT JOIN session_games sg ON s.id = sg.session_id
|
||||||
@@ -29,7 +34,12 @@ router.get('/', (req, res) => {
|
|||||||
ORDER BY s.created_at DESC
|
ORDER BY s.created_at DESC
|
||||||
`).all();
|
`).all();
|
||||||
|
|
||||||
res.json(sessions);
|
const result = sessions.map(({ notes, ...session }) => {
|
||||||
|
const { has_notes, notes_preview } = computeNotesPreview(notes);
|
||||||
|
return { ...session, has_notes, notes_preview };
|
||||||
|
});
|
||||||
|
|
||||||
|
res.json(result);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
res.status(500).json({ error: error.message });
|
res.status(500).json({ error: error.message });
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
const request = require('supertest');
|
||||||
|
const { app } = require('../../backend/server');
|
||||||
|
const { cleanDb, getAuthHeader, seedSession } = require('../helpers/test-utils');
|
||||||
const { computeNotesPreview } = require('../../backend/utils/notes-preview');
|
const { computeNotesPreview } = require('../../backend/utils/notes-preview');
|
||||||
|
|
||||||
describe('computeNotesPreview', () => {
|
describe('computeNotesPreview', () => {
|
||||||
@@ -62,3 +65,42 @@ describe('computeNotesPreview', () => {
|
|||||||
expect(result.notes_preview).not.toContain('...');
|
expect(result.notes_preview).not.toContain('...');
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
|
describe('GET /api/sessions list', () => {
|
||||||
|
beforeEach(() => {
|
||||||
|
cleanDb();
|
||||||
|
});
|
||||||
|
|
||||||
|
test('includes has_notes and notes_preview in list response', async () => {
|
||||||
|
seedSession({ notes: '**Bold** first paragraph\n\nSecond paragraph' });
|
||||||
|
seedSession({ notes: null });
|
||||||
|
|
||||||
|
const res = await request(app).get('/api/sessions');
|
||||||
|
|
||||||
|
expect(res.status).toBe(200);
|
||||||
|
expect(res.body).toHaveLength(2);
|
||||||
|
|
||||||
|
const withNotes = res.body.find(s => s.has_notes === true);
|
||||||
|
const withoutNotes = res.body.find(s => s.has_notes === false);
|
||||||
|
|
||||||
|
expect(withNotes.notes_preview).toBe('Bold first paragraph');
|
||||||
|
expect(withNotes).not.toHaveProperty('notes');
|
||||||
|
|
||||||
|
expect(withoutNotes.notes_preview).toBeNull();
|
||||||
|
expect(withoutNotes).not.toHaveProperty('notes');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('list response preserves existing fields', async () => {
|
||||||
|
seedSession({ is_active: 1, notes: 'Test' });
|
||||||
|
|
||||||
|
const res = await request(app).get('/api/sessions');
|
||||||
|
|
||||||
|
expect(res.status).toBe(200);
|
||||||
|
expect(res.body[0]).toHaveProperty('id');
|
||||||
|
expect(res.body[0]).toHaveProperty('created_at');
|
||||||
|
expect(res.body[0]).toHaveProperty('closed_at');
|
||||||
|
expect(res.body[0]).toHaveProperty('is_active');
|
||||||
|
expect(res.body[0]).toHaveProperty('games_played');
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user