kjh2064
58edbd9c8f
refactor: Phase 5 - JWT token lifecycle (Access + Refresh + Auto-refresh)
...
TaxBaik CI/CD / build-and-deploy (push) Successful in 48s
**Implementation:**
- AuthService: Split token generation
* AccessToken: 15 minutes
* RefreshToken: 7 days (10080 minutes)
* New: GenerateTokenPair() method
* New: RefreshAccessTokenAsync() method
- AuthTokenPair: New record (accessToken, refreshToken, expiresIn)
- AuthController: New /api/auth/refresh endpoint
* POST /api/auth/refresh?refreshToken=...
* Response: { accessToken, refreshToken, expiresIn }
* RefreshTokenRequest DTO
- TokenRefreshHandler: New DelegatingHandler
* Automatic Bearer token injection
* 401 response handling
* Auto-refresh with retry
* localStorage sync (accessToken, refreshToken, tokenExpiry)
- CustomAuthenticationStateProvider: Token storage split
* Before: auth_token (single)
* After: accessToken, refreshToken, tokenExpiry
* LoginAsync signature updated
- Login.razor: Handle token pair
* LoginResponse: { accessToken, refreshToken, expiresIn }
* Call new LoginAsync(accessToken, refreshToken, expiresIn)
- Program.cs: TokenRefreshHandler registration
* AddScoped<TokenRefreshHandler>()
* AdminDashboardClient pipeline: .AddHttpMessageHandler<TokenRefreshHandler>()
**SOLID Principles:**
✓ S (Single Responsibility): TokenRefreshHandler handles only token refresh
✓ D (Dependency Inversion): DelegatingHandler abstracts HTTP concerns
✓ O (Open/Closed): Token lifetime extension without code changes
**Security Pattern:**
- Short-lived access tokens (15min) reduce theft window
- Refresh tokens (7d) enable persistence without storing secrets
- Automatic refresh is transparent to components
**Flow:**
Blazor → AdminDashboardClient → TokenRefreshHandler (auto-add Bearer)
→ 401 → RefreshTokenAsync() → POST /api/auth/refresh
→ Store new pair → Retry original request
Status: Token lifecycle complete, ready for SignalR integration (Phase 6)
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-28 10:51:24 +09:00
kjh2064
0334a5f607
refactor: Phase 4 - Dashboard Blazor → API client (Service Locator → Dependency Injection)
...
TaxBaik CI/CD / build-and-deploy (push) Successful in 1m19s
**Implementation:**
- AdminDashboardClient: HTTP API client interface
- GetSummaryAsync: Fetch dashboard metrics
- GetUpcomingFilingsAsync: 30-day filings forecast
- GetRecentInquiriesAsync: Latest inquiries
- GetMonthlyStatsAsync: Monthly statistics
- Program.cs: Register IAdminDashboardClient
- Dashboard.razor: Replace service injection with API client
- Remove: Direct AdminDashboardService/TaxFilingService injection
- Add: IAdminDashboardClient injection
- Add: Error handling & loading state
- Change: OnInitializedAsync() calls API endpoints
**SOLID Principles Applied:**
✓ D (Dependency Inversion): Blazor depends on IAdminDashboardClient abstraction
✓ S (Single Responsibility): Client handles only HTTP communication
✓ O (Open/Closed): Can extend API without changing Blazor component
**Architecture Pattern:**
- Before: Blazor → Service (server-side logic) → Repository → DB
- After: Blazor → HTTP → API → Service → Repository → DB
**Benefits:**
- Clear separation of concerns
- Easier to test (mock HTTP)
- Foundation for token refresh middleware
- Prepare for SignalR integration
Status: Ready for Phase 5 (JWT token refresh)
Next: Implement automatic token refresh on 401 responses
Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com >
2026-06-28 10:47:29 +09:00
kjh2064
6af9221fab
fix: 문의 폼 제출과 텔레그램 추적 로그 개선
TaxBaik CI/CD / build-and-deploy (push) Successful in 59s
TaxBaik Browser E2E / browser-e2e (push) Failing after 1m42s
2026-06-27 22:29:08 +09:00
kjh2064
301efb32ff
fix: 텔레그램 알림 운영 설정 배포
TaxBaik CI/CD / build-and-deploy (push) Failing after 44s
TaxBaik Browser E2E / browser-e2e (push) Failing after 10m30s
2026-06-27 22:12:08 +09:00
kjh2064
f29f2c3cff
개선: 배포 검증과 관리자 UX 안정화
TaxBaik Browser E2E / browser-e2e (push) Failing after 1m3s
TaxBaik CI/CD / build-and-deploy (push) Failing after 2m46s
2026-06-27 20:57:09 +09:00
kjh2064
e3f548f163
feat: include inquiry status changer in alerts
TaxBaik Browser E2E / browser-e2e (push) Failing after 1m6s
TaxBaik CI/CD / build-and-deploy (push) Successful in 1m26s
2026-06-27 16:36:31 +09:00
kjh2064
832aa49e96
feat: improve inquiry list and telegram ids
TaxBaik Browser E2E / browser-e2e (push) Successful in 37s
TaxBaik CI/CD / build-and-deploy (push) Successful in 1m20s
2026-06-27 16:30:23 +09:00
kjh2064
046a16c75b
fix: use stable inquiry list links
TaxBaik Browser E2E / browser-e2e (push) Successful in 1m19s
TaxBaik CI/CD / build-and-deploy (push) Successful in 1m22s
2026-06-27 16:28:33 +09:00
kjh2064
4f2d5b1777
feat: enrich inquiry telegram alerts
TaxBaik Browser E2E / browser-e2e (push) Successful in 34s
TaxBaik CI/CD / build-and-deploy (push) Failing after 1m9s
2026-06-27 16:10:58 +09:00
kjh2064
620491fa9f
feat: notify inquiry status changes
TaxBaik Browser E2E / browser-e2e (push) Successful in 1m1s
TaxBaik CI/CD / build-and-deploy (push) Successful in 1m33s
2026-06-27 16:04:23 +09:00
kjh2064
5626f976fc
feat: improve inquiry notification links
TaxBaik Browser E2E / browser-e2e (push) Successful in 35s
TaxBaik CI/CD / build-and-deploy (push) Successful in 1m22s
2026-06-27 16:02:14 +09:00
kjh2064
f54cab5562
feat: notify telegram on new inquiries
TaxBaik CI/CD / build-and-deploy (push) Successful in 1m33s
TaxBaik Browser E2E / browser-e2e (push) Successful in 2m8s
2026-06-27 15:58:42 +09:00
kjh2064
28060b71be
feat: harden auth ops and deployment baseline
2026-06-27 10:53:53 +09:00
kjh2064
1d7dd71011
fix: unify TaxBaik deployment around CI
TaxBaik CI/CD / build-and-deploy (push) Successful in 41s
2026-06-27 01:34:17 +09:00
kjh2064
f8679cafcb
refactor: UI를 API 기반으로 리팩토링 - 비즈니스 로직과 View 완전 분리
...
TaxBaik CI/CD / build-and-deploy (push) Failing after 41s
1️⃣ HttpClient 서비스 추가
- IApiClient 인터페이스 구현
- GET, POST, PUT, DELETE 메서드
- JWT 토큰 자동 관리
- /taxbaik/api 경로 자동 처리
2️⃣ Razor Pages 리팩토링
- Pages/Index.cshtml.cs: API /api/blog 호출
- Pages/Blog/Index.cshtml.cs: API /api/blog, /api/category 호출
- Pages/Contact.cshtml.cs: API /api/inquiry 호출
- Service 의존성 제거
3️⃣ Blazor Components 리팩토링
- Login.razor: API /api/auth/login 호출로 변경
- BlogList.razor: API /api/blog/admin/all 호출로 변경
- Service 의존성 제거
아키텍처:
View (Razor Pages + Blazor)
↓ HttpClient
Controllers (REST API)
↓
Services (비즈니스 로직)
↓
Repository (DB)
테스트 결과:
✅ 홈페이지: 200 OK
✅ 블로그 페이지: 200 OK
✅ 문의 페이지: 200 OK
✅ 로그인 페이지: 200 OK
✅ API 엔드포인트 모두 작동
장점:
• UI 리뉴얼 시 API 변경 불필요
• 모바일앱, 데스크톱 클라이언트 추가 가능
• 비즈니스 로직과 UI 완전 독립
• 테스트 가능한 구조 완성
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com >
2026-06-26 22:56:41 +09:00
kjh2064
57269e281d
refactor: Web과 Admin 통합 - 단일 포트 5001로 운영
...
TaxBaik CI/CD / build-and-deploy (push) Failing after 36s
분리의 단점을 제거하고 단일 앱으로 통합:
구조 변경:
- TaxBaik.Admin → TaxBaik.Web/Components/Admin/
- Admin Services → TaxBaik.Web/Services/
- 포트: 5001 (기존 5002 제거)
경로:
- 홈페이지: http://localhost:5001/taxbaik
- 관리자: http://localhost:5001/taxbaik/admin
기술:
- Razor Pages (Web) + Blazor Server (Admin) 통합
- 단일 Program.cs로 양쪽 모두 지원
- JWT 인증 유지
- MudBlazor UI 유지
장점:
- 개발 복잡도 감소 (터미널 1개)
- 배포 단순화 (앱 1개)
- DB 마이그레이션 1회 실행
Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com >
2026-06-26 22:35:21 +09:00