Files
library/apps/frontend/src/app/app.routes.ts
T
hikari 34c7ca8ba2 feat: implement user profiles and settings
Add comprehensive user profile system allowing users to showcase
their activity and customize their profiles.

Database Changes:
- Added profile fields to User model: slug, displayName, bio, profilePublic
- Added index on slug field for efficient lookups

API Changes:
- Added GET /users/me endpoint to fetch current user
- Added PUT /users/me endpoint to update user settings
- Added GET /users/profile/:identifier endpoint for public profiles
- Updated UserService with profile methods and statistics
- Modified AuthService to include profile fields in user responses

Frontend Changes:
- Created ProfileComponent to display user profiles with stats
- Created SettingsComponent for profile customization
- Added profile and settings routes
- Updated header dropdown menu with profile links
- Enhanced UserService with profile methods
- Added updateUser method to AuthService

Features:
- Custom profile slugs for clean URLs
- Display names separate from usernames
- User bios (up to 500 characters)
- Public/private profile toggle
- Activity statistics (suggestions, likes, comments, acceptance rate)
- Badge display (Staff, Mod, VIP, Discord Member)
- Beautiful witch-themed styling

Closes #45
2026-02-19 17:27:35 -08:00

65 lines
2.0 KiB
TypeScript

import { Route } from '@angular/router';
export const appRoutes: Route[] = [
{
path: '',
loadComponent: () => import('./components/home/home.component').then(m => m.HomeComponent)
},
{
path: 'games',
loadComponent: () => import('./components/games/games-list.component').then(m => m.GamesListComponent)
},
{
path: 'books',
loadComponent: () => import('./components/books/books-list.component').then(m => m.BooksListComponent)
},
{
path: 'music',
loadComponent: () => import('./components/music/music-list.component').then(m => m.MusicListComponent)
},
{
path: 'art',
loadComponent: () => import('./components/art/art-gallery.component').then(m => m.ArtGalleryComponent)
},
{
path: 'shows',
loadComponent: () => import('./components/shows/shows-list.component').then(m => m.ShowsListComponent)
},
{
path: 'manga',
loadComponent: () => import('./components/manga/manga-list.component').then(m => m.MangaListComponent)
},
{
path: 'admin/users',
loadComponent: () => import('./components/admin/admin-users.component').then(m => m.AdminUsersComponent)
},
{
path: 'admin/audit',
loadComponent: () => import('./components/admin/admin-audit.component').then(m => m.AdminAuditComponent)
},
{
path: 'admin/suggestions',
loadComponent: () => import('./components/admin/admin-suggestions.component').then(m => m.AdminSuggestionsComponent)
},
{
path: 'my-suggestions',
loadComponent: () => import('./components/my-suggestions/my-suggestions.component').then(m => m.MySuggestionsComponent)
},
{
path: 'my-likes',
loadComponent: () => import('./components/my-likes/my-likes.component').then(m => m.MyLikesComponent)
},
{
path: 'profile/:identifier',
loadComponent: () => import('./components/profile/profile.component').then(m => m.ProfileComponent)
},
{
path: 'settings',
loadComponent: () => import('./components/settings/settings.component').then(m => m.SettingsComponent)
},
{
path: '**',
redirectTo: ''
}
];