feat(m15): full test completion + quality gate + validation fixes

- Add E2E notifications.spec (member-added notification -> list -> mark read)
  and activity-log.spec (board_posted + todo_created recorded)
- Set Playwright workers=1 for deterministic full-suite runs (SSE test under
  parallel load); full E2E suite (18 tests / 13 specs incl. 12 mandated
  scenarios) green
- Quality gate: 251 unit/integration tests, lint clean, typecheck clean,
  build succeeds, coverage 91.13% Repository/Service (>=80%)
- Validation fixes (mandatory): SearchService now searches ALL items
  (large pageSize) instead of first page only; MeetingService.
  checkScheduleConflicts now requires membership (actorId) to prevent
  non-member info enumeration
This commit is contained in:
Ken Yasue
2026-06-25 02:54:48 +02:00
parent 2bc883cb6f
commit f9720850b2
7 changed files with 145 additions and 5 deletions

View File

@ -75,6 +75,7 @@ export class MeetingService {
this.requireMember(projectId, actorId);
this.validate(input);
const conflicts = this.checkScheduleConflicts(
actorId,
projectId,
input.memberIds,
input.startAt,
@ -175,12 +176,14 @@ export class MeetingService {
* 重複は警告(作成ブロックしない)。時間重複 = NOT(existing.end <= new.start OR existing.start >= new.end)
*/
checkScheduleConflicts(
actorId: number,
projectId: number,
memberIds: number[],
startAt: string,
endAt: string,
excludeMeetingId?: number
): ScheduleConflict[] {
this.requireMember(projectId, actorId);
const conflicts: ScheduleConflict[] = [];
const newStart = new Date(startAt).getTime();
const newEnd = new Date(endAt).getTime();