Problem
Status strings (`'pending'`, `'approved'`, `'published'`, `'rejected'`, `'cancelled'`) are scattered as bare string literals across 10+ API routes and admin pages:
- `events/submit.ts`: `status: 'pending'`
- `events-staged/approve.ts`: `status: 'approved'`
- `events-staged/reject.ts`: `status: 'rejected'`
- `announcements/submit.ts`: `status: 'pending'`
- `announcements/approve.ts`: `status: 'published'`
- Admin dashboard JS: status badge rendering with string comparisons
Proposed Solution
Add status enums to `src/lib/constants.ts`:
```typescript
export const EVENT_STATUS = {
PENDING: 'pending',
APPROVED: 'approved',
REJECTED: 'rejected',
CANCELLED: 'cancelled',
} as const;
export const ANNOUNCEMENT_STATUS = {
PENDING: 'pending',
PUBLISHED: 'published',
REJECTED: 'rejected',
} as const;
```
Impact
Prevents typo bugs, enables autocomplete, single source of truth.
Problem
Status strings (`'pending'`, `'approved'`, `'published'`, `'rejected'`, `'cancelled'`) are scattered as bare string literals across 10+ API routes and admin pages:
Proposed Solution
Add status enums to `src/lib/constants.ts`:
```typescript
export const EVENT_STATUS = {
PENDING: 'pending',
APPROVED: 'approved',
REJECTED: 'rejected',
CANCELLED: 'cancelled',
} as const;
export const ANNOUNCEMENT_STATUS = {
PENDING: 'pending',
PUBLISHED: 'published',
REJECTED: 'rejected',
} as const;
```
Impact
Prevents typo bugs, enables autocomplete, single source of truth.