feat(m12): meetings + schedule conflict detection, tests, e2e

- MeetingRepository (CRUD, soft-delete, members, findMeetingsByUserInRange
  overlap) + CalendarRepository.findByCreatorInRange + TodoRepository.
  findHighPriorityByAssignee
- MeetingService (createMeeting tx+members, meeting_invited notify,
  meeting_created activity, SSE meeting.created; updateMeeting/updateMinutes/
  deleteMeeting; checkScheduleConflicts = other meetings overlap + calendar
  events overlap + high-priority todos due +-3d, time-overlap logic,
  excludeMeetingId; conflicts are warnings)
- APIs: meetings list/create/edit + /check conflict check
- Screens: meetings page + MeetingForm(member checkboxes, conflict display)
  + ConflictWarning, ProjectNav link
- Unit tests (MeetingRepository, MeetingService incl. conflict algorithm)
  + e2e meetings
This commit is contained in:
Ken Yasue
2026-06-25 02:19:25 +02:00
parent 09e1e5e22a
commit 29e4bc6650
14 changed files with 1371 additions and 0 deletions

View File

@ -271,4 +271,21 @@ export class TodoRepository {
);
return result.changes > 0;
}
/** 指定期間内に期限を迎える、指定担当者の高優先度ToDo(スケジュール重複判定用) */
findHighPriorityByAssignee(
projectId: number,
assigneeId: number,
from: string,
to: string
): TodoItem[] {
const rows = this.db.query<TodoItemRow>(
`SELECT * FROM todo_items
WHERE project_id = @projectId AND assignee_id = @assigneeId
AND priority = 'high' AND deleted_at IS NULL
AND due_date IS NOT NULL AND due_date >= @from AND due_date <= @to`,
{ projectId, assigneeId, from, to }
);
return rows.map(mapItem);
}
}