diff --git a/backend/routes/sessions.js b/backend/routes/sessions.js index a4732d2..f362f99 100644 --- a/backend/routes/sessions.js +++ b/backend/routes/sessions.js @@ -5,6 +5,7 @@ const db = require('../database'); const { triggerWebhook } = require('../utils/webhooks'); const { getWebSocketManager } = require('../utils/websocket-manager'); const { startMonitor, stopMonitor, getMonitorSnapshot } = require('../utils/ecast-shard-client'); +const { computeNotesPreview } = require('../utils/notes-preview'); const router = express.Router(); @@ -21,7 +22,11 @@ router.get('/', (req, res) => { try { const sessions = db.prepare(` SELECT - s.*, + s.id, + s.created_at, + s.closed_at, + s.is_active, + s.notes, COUNT(sg.id) as games_played FROM sessions s 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 `).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) { res.status(500).json({ error: error.message }); } diff --git a/tests/api/session-notes.test.js b/tests/api/session-notes.test.js index 20f0fc9..7c84eb5 100644 --- a/tests/api/session-notes.test.js +++ b/tests/api/session-notes.test.js @@ -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'); describe('computeNotesPreview', () => { @@ -62,3 +65,42 @@ describe('computeNotesPreview', () => { 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'); + }); +}); +