feat: initial commit — backend API + student cabinet frontend

- Go backend: auth (JWT), points earn/spend, QR token generation,
  partners, admin grant/stats endpoints with chi router
- Next.js 14 frontend: login, student dashboard, transaction history,
  QR display, partners list
- PostgreSQL migrations (4 tables), Redis cache, Docker Compose
- CORS middleware, role-based route protection, Zustand auth store

Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
emil
2026-05-01 10:03:27 +03:00
co-authored by Claude Sonnet 4.6
commit 50b3c4198a
80 changed files with 10579 additions and 0 deletions
+32
View File
@@ -0,0 +1,32 @@
// Utility helpers for formatting numbers and dates throughout the UI.
/**
* Formats a point balance for display: 1234 → "1 234 pts"
* Uses the Russian locale so thousands are separated by a space.
*/
export function formatPoints(n: number): string {
return `${new Intl.NumberFormat('ru-RU').format(n)} pts`;
}
/**
* Formats a transaction amount with a sign prefix.
* Positive amounts use a "+" prefix; negative amounts use the Unicode minus sign "−".
* Example: 50 → "+50", -30 → "−30"
*/
export function formatTransactionAmount(amount: number): string {
if (amount >= 0) return `+${amount}`;
return `−${Math.abs(amount)}`; // U+2212 MINUS SIGN, visually distinct from hyphen
}
/**
* Formats a UTC ISO timestamp to a compact Russian date+time string.
* Example: "2024-04-28T14:32:00Z" → "28 апр., 14:32"
*/
export function formatDate(iso: string): string {
return new Intl.DateTimeFormat('ru-RU', {
day: 'numeric',
month: 'short',
hour: '2-digit',
minute: '2-digit',
}).format(new Date(iso));
}