[
{
"id": 142567890,
"iid": 500,
"project_id": 99999,
"title": "N+1 query in approval check causes slow page loads",
"description": "## Problem\n\nWhen viewing a merge request page with multiple approval rules, load time is degraded due to N+1 queries.\n\n### Steps to Reproduce\n\n1. Create a project with 10+ approval rules\n2. Create a merge request\n3. Open the MR page\n4. Observe 40+ SQL queries in performance bar\n\n### Expected: under 500ms. Actual: 2-3 seconds.\n\n### Logs\n\n```\n[ActiveRecord] Query (2.3ms) SELECT * FROM approval_rules WHERE merge_request_id = 101\n[ActiveRecord] Query (1.8ms) SELECT * FROM approvals WHERE approval_rule_id = 4501\n[ActiveRecord] Query (1.9ms) SELECT * FROM approvals WHERE approval_rule_id = 4502\n```\n\nHigh impact — affects enterprise customers using approval rules.\n\n/label ~bug ~performance ~database ~P1\n/milestone %v3.2",
"state": "closed",
"created_at": "2026-03-05T09:00:00.000Z",
"updated_at": "2026-03-12T14:30:00.000Z",
"closed_at": "2026-03-12T14:30:00.000Z",
"closed_by": {
"id": 1001,
"username": "dev_tom",
"name": "Tom D",
"state": "active",
"locked": false,
"avatar_url": "https://example.com/avatars/tom.png",
"web_url": "https://example.com/dev_tom"
},
"labels": ["bug", "performance", "database", "P1", "customer-reported"],
"milestone": {
"id": 2890,
"iid": 98,
"project_id": 99999,
"title": "v3.2",
"description": "Sprint 3.2",
"state": "active",
"created_at": "2026-02-01T00:00:00.000Z",
"updated_at": "2026-03-01T00:00:00.000Z",
"due_date": "2026-03-22",
"start_date": "2026-02-22",
"expired": false,
"web_url": "https://example.com/milestones/98"
},
"assignees": [
{
"id": 1001,
"username": "dev_tom",
"name": "Tom D",
"state": "active",
"locked": false,
"avatar_url": "https://example.com/avatars/tom.png",
"web_url": "https://example.com/dev_tom"
}
],
"author": {
"id": 9999,
"username": "support_bot",
"name": "Support Bot",
"state": "active",
"locked": false,
"avatar_url": "https://example.com/avatars/support.png",
"web_url": "https://example.com/support_bot"
},
"type": "ISSUE",
"user_notes_count": 18,
"merge_requests_count": 1,
"upvotes": 8,
"downvotes": 0,
"due_date": "2026-03-15",
"confidential": false,
"discussion_locked": null,
"issue_type": "issue",
"web_url": "https://example.com/acme/project/-/issues/500",
"time_stats": {
"time_estimate": 28800,
"total_time_spent": 14400,
"human_time_estimate": "1d",
"human_total_time_spent": "4h"
},
"task_completion_status": {
"count": 0,
"completed_count": 0
},
"weight": 5,
"blocking_issues_count": 0,
"has_tasks": false,
"task_status": "",
"_links": {
"self": "https://example.com/api/v4/projects/99999/issues/500",
"notes": "https://example.com/api/v4/projects/99999/issues/500/notes",
"award_emoji": "https://example.com/api/v4/projects/99999/issues/500/award_emoji",
"project": "https://example.com/api/v4/projects/99999",
"closed_as_duplicate_of": null
},
"references": {
"short": "#500",
"relative": "#500",
"full": "acme/project#500"
},
"severity": "high",
"subscribed": true,
"moved_to_id": null,
"imported": false,
"imported_from": "none",
"service_desk_reply_to": null
},
{
"id": 142567800,
"iid": 401,
"project_id": 99999,
"title": "Implement rate limiting for OAuth2 token exchange endpoint",
"description": "## Feature Request\n\nAs part of the OAuth2 PKCE implementation (#400), we need rate limiting on token exchange to prevent brute-force attacks.\n\n### Requirements\n\n- Rate limit: 10 req/min per client_id\n- Return HTTP 429 with Retry-After header\n- Log rate-limited attempts\n- Configurable via admin settings\n\n### Acceptance Criteria\n\n- [ ] Rate limiting with Redis backend\n- [ ] HTTP 429 responses with proper headers\n- [ ] Admin configurable limits\n- [ ] Audit log entries\n- [ ] Documentation updated\n\n/label ~feature ~security ~oauth ~backend\n/milestone %v3.2",
"state": "opened",
"created_at": "2026-03-06T10:00:00.000Z",
"updated_at": "2026-03-11T15:00:00.000Z",
"closed_at": null,
"closed_by": null,
"labels": ["feature", "security", "oauth", "backend"],
"milestone": {
"id": 2890,
"iid": 98,
"project_id": 99999,
"title": "v3.2",
"description": "Sprint 3.2",
"state": "active",
"created_at": "2026-02-01T00:00:00.000Z",
"updated_at": "2026-03-01T00:00:00.000Z",
"due_date": "2026-03-22",
"start_date": "2026-02-22",
"expired": false,
"web_url": "https://example.com/milestones/98"
},
"assignees": [
{
"id": 5678,
"username": "alice_c",
"name": "Alice C",
"state": "active",
"locked": false,
"avatar_url": "https://example.com/avatars/alice.png",
"web_url": "https://example.com/alice_c"
}
],
"author": {
"id": 5678,
"username": "alice_c",
"name": "Alice C",
"state": "active",
"locked": false,
"avatar_url": "https://example.com/avatars/alice.png",
"web_url": "https://example.com/alice_c"
},
"type": "ISSUE",
"user_notes_count": 7,
"merge_requests_count": 0,
"upvotes": 3,
"downvotes": 0,
"due_date": "2026-03-20",
"confidential": false,
"discussion_locked": null,
"issue_type": "issue",
"web_url": "https://example.com/acme/project/-/issues/401",
"time_stats": {
"time_estimate": 0,
"total_time_spent": 0,
"human_time_estimate": null,
"human_total_time_spent": null
},
"task_completion_status": {
"count": 5,
"completed_count": 0
},
"weight": 3,
"blocking_issues_count": 0,
"has_tasks": true,
"task_status": "0 of 5 checklist items completed",
"_links": {
"self": "https://example.com/api/v4/projects/99999/issues/401",
"notes": "https://example.com/api/v4/projects/99999/issues/401/notes",
"award_emoji": "https://example.com/api/v4/projects/99999/issues/401/award_emoji",
"project": "https://example.com/api/v4/projects/99999",
"closed_as_duplicate_of": null
},
"references": {
"short": "#401",
"relative": "#401",
"full": "acme/project#401"
},
"severity": "medium",
"subscribed": true,
"moved_to_id": null,
"imported": false,
"imported_from": "none",
"service_desk_reply_to": null
}
]