From 1e06e2f783f02e98a5c1417bd7cc63399ae37fcd Mon Sep 17 00:00:00 2001 From: "smalruby3-editor-bot[bot]" <297607354+smalruby3-editor-bot[bot]@users.noreply.github.com> Date: Sat, 18 Jul 2026 04:13:29 +0000 Subject: [PATCH] fix(classroom): omit empty ExpressionAttributeNames on mine=1 shared list MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit DynamoDB rejects an empty ExpressionAttributeNames map, so GET /shared-assignments?mine=1 (自分の投稿タグ) always returned 500 when no attribute filters were set — the query needs no #status alias in mine mode. Build the map first and spread the key in only when non-empty (same pattern as the group update at handler.ts:2591). Found during PR #1080 review on prod (2026-07-18). Co-Authored-By: Claude Opus 4.8 (1M context) --- infra/smalruby-classroom/lambda/handler.ts | 11 +++++++---- .../lambda/tests/handler-shared-assignments.test.ts | 4 ++++ 2 files changed, 11 insertions(+), 4 deletions(-) diff --git a/infra/smalruby-classroom/lambda/handler.ts b/infra/smalruby-classroom/lambda/handler.ts index 46daa8204d..8030532f9a 100644 --- a/infra/smalruby-classroom/lambda/handler.ts +++ b/infra/smalruby-classroom/lambda/handler.ts @@ -3752,14 +3752,17 @@ async function handleListSharedAssignments( } } + // DynamoDB rejects an EMPTY ExpressionAttributeNames map, so the key must + // be omitted when there is nothing to alias (mine=1 with no filters). + const expressionNames = { + ...(mine ? {} : { '#status': 'status' }), + ...names, + }; const result = await docClient.send(new QueryCommand({ TableName: SHARED_ASSIGNMENTS_TABLE, IndexName: mine ? 'authorSub-createdAt-index' : 'status-createdAt-index', KeyConditionExpression: mine ? 'authorSub = :pk' : '#status = :pk', - ExpressionAttributeNames: { - ...(mine ? {} : { '#status': 'status' }), - ...names, - }, + ...(Object.keys(expressionNames).length > 0 ? { ExpressionAttributeNames: expressionNames } : {}), ExpressionAttributeValues: { ':pk': mine ? identity.sub : 'published', ...values, diff --git a/infra/smalruby-classroom/lambda/tests/handler-shared-assignments.test.ts b/infra/smalruby-classroom/lambda/tests/handler-shared-assignments.test.ts index 9127b2ead1..e59833fa55 100644 --- a/infra/smalruby-classroom/lambda/tests/handler-shared-assignments.test.ts +++ b/infra/smalruby-classroom/lambda/tests/handler-shared-assignments.test.ts @@ -325,6 +325,10 @@ describe('みんなの課題 (issue #1068)', () => { })); expect(captured?.IndexName).toBe('authorSub-createdAt-index'); expect((captured?.ExpressionAttributeValues as Record)[':pk']).toBe('dev-test-teacher'); + // DynamoDB rejects an EMPTY ExpressionAttributeNames map — with no + // filters and no #status alias, the key must be omitted entirely + // (prod 500 on 自分の投稿, 2026-07-18). + expect(captured?.ExpressionAttributeNames).toBeUndefined(); expect(JSON.parse(res.body as string).items[0].status).toBe('unlisted'); }); });