You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Copy file name to clipboardExpand all lines: README.md
+33Lines changed: 33 additions & 0 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -278,6 +278,39 @@ The following error cases are implemented:
278
278
|**Set Default Card**| 404 |`{ error: 'Card not found' }` — when card ID doesn't exist or doesn't belong to authenticated user |
279
279
|**Successful Deletion**| 204 | No content |
280
280
281
+
## Events & Attendance
282
+
283
+
Users can mark themselves as attending an event (hackathon) and choose a role. Reading an event and its attendee list is public; marking/leaving attendance requires authentication.
284
+
285
+
| Method | Endpoint | Auth | Description |
286
+
|--------|----------|------|-------------|
287
+
|`GET`|`/api/events/:slug`| No | Event details + attendee count |
288
+
|`GET`|`/api/events/:slug/attendees`| No | Paginated attendee list, each with a public `role`|
|**Leave**| 404 |`{ error: 'User not found' }` — not currently attending |
305
+
|**Leave**| 204 | No content |
306
+
307
+
### Attendance spam rules
308
+
309
+
To keep normal sign-ups frictionless while catching mass-marking ("marking every hackathon without attending"), two independent guardrails run on the join route:
310
+
311
+
-**Rate limit (hard block):** the join route is capped at **10 requests/minute**; excess requests are rejected with **HTTP 429**. This stops scripted retries.
312
+
-**Heuristic (soft flag):** if a user marks attendance for **8 or more events within a 5-minute window**, the attendee record is stored with `flagged = true` and an audit line is logged for moderator review. **The join still succeeds** — legitimate users are never blocked, and `flagged` is never exposed on the public attendee list. Both thresholds are tunable constants (`SPAM_WINDOW_MINUTES`, `SPAM_MAX_JOINS`) in `apps/backend/src/routes/event.ts`.
313
+
281
314
## Good First Issues
282
315
283
316
New to open source? We've got you covered! Check out our [Good First Issues](https://github.com/Dev-Card/DevCard/issues?q=is%3Aopen+label%3A%22good-first-issue%22), these are specially curated issues that are:
0 commit comments