@withwiz/toolkit 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +162 -0
- package/dist/auth/adapters/prisma/index.d.ts +43 -0
- package/dist/auth/adapters/prisma/index.js +284 -0
- package/dist/auth/core/email/token-generator.d.ts +43 -0
- package/dist/auth/core/email/token-generator.js +7 -0
- package/dist/auth/core/jwt/client.d.ts +87 -0
- package/dist/auth/core/jwt/client.js +36 -0
- package/dist/auth/core/jwt/index.d.ts +110 -0
- package/dist/auth/core/jwt/index.js +10 -0
- package/dist/auth/core/jwt/types.d.ts +6 -0
- package/dist/auth/core/jwt/types.js +13 -0
- package/dist/auth/core/oauth/index.d.ts +51 -0
- package/dist/auth/core/oauth/index.js +12 -0
- package/dist/auth/core/password/client-helper.d.ts +44 -0
- package/dist/auth/core/password/client-helper.js +28 -0
- package/dist/auth/core/password/index.d.ts +71 -0
- package/dist/auth/core/password/index.js +14 -0
- package/dist/auth/errors/index.d.ts +49 -0
- package/dist/auth/errors/index.js +17 -0
- package/dist/auth/index.d.ts +21 -0
- package/dist/auth/index.js +97 -0
- package/dist/auth/types/index.d.ts +213 -0
- package/dist/auth/types/index.js +13 -0
- package/dist/cache/cache-config.d.ts +73 -0
- package/dist/cache/cache-config.js +12 -0
- package/dist/cache/cache-defaults.d.ts +141 -0
- package/dist/cache/cache-defaults.js +33 -0
- package/dist/cache/cache-env.d.ts +75 -0
- package/dist/cache/cache-env.js +25 -0
- package/dist/cache/cache-factory.d.ts +34 -0
- package/dist/cache/cache-factory.js +28 -0
- package/dist/cache/cache-invalidation.d.ts +90 -0
- package/dist/cache/cache-invalidation.js +24 -0
- package/dist/cache/cache-keys-legacy.d.ts +35 -0
- package/dist/cache/cache-keys-legacy.js +7 -0
- package/dist/cache/cache-redis.d.ts +74 -0
- package/dist/cache/cache-redis.js +24 -0
- package/dist/cache/cache-types.d.ts +151 -0
- package/dist/cache/cache-types.js +9 -0
- package/dist/cache/cache-wrapper.d.ts +27 -0
- package/dist/cache/cache-wrapper.js +22 -0
- package/dist/cache/cache.d.ts +14 -0
- package/dist/cache/cache.js +112 -0
- package/dist/cache/hybrid-cache-manager.d.ts +148 -0
- package/dist/cache/hybrid-cache-manager.js +13 -0
- package/dist/cache/index.d.ts +21 -0
- package/dist/cache/index.js +112 -0
- package/dist/cache/inmemory-cache-manager.d.ts +163 -0
- package/dist/cache/inmemory-cache-manager.js +9 -0
- package/dist/cache/noop-cache-manager.d.ts +36 -0
- package/dist/cache/noop-cache-manager.js +11 -0
- package/dist/cache/redis-cache-manager.d.ts +34 -0
- package/dist/cache/redis-cache-manager.js +11 -0
- package/dist/chunk-26Y7VEYG.js +93 -0
- package/dist/chunk-2DVWSDST.js +119 -0
- package/dist/chunk-2KAPUVIS.js +155 -0
- package/dist/chunk-2TO7WUKK.js +93 -0
- package/dist/chunk-34WAGUT5.js +117 -0
- package/dist/chunk-3DZA6AGS.js +120 -0
- package/dist/chunk-4DPSCTX4.js +212 -0
- package/dist/chunk-4KJXENRM.js +64 -0
- package/dist/chunk-4NWJ3WCZ.js +28 -0
- package/dist/chunk-4ODT3Q4A.js +86 -0
- package/dist/chunk-5ATB5D6S.js +40 -0
- package/dist/chunk-62FLBG6B.js +34 -0
- package/dist/chunk-62Q7DN5G.js +25 -0
- package/dist/chunk-65LHDFU3.js +242 -0
- package/dist/chunk-6C7HQIX4.js +13 -0
- package/dist/chunk-6D3HHYER.js +32 -0
- package/dist/chunk-6LTZCXNC.js +326 -0
- package/dist/chunk-7VJNLGAS.js +110 -0
- package/dist/chunk-7XFHGAJP.js +0 -0
- package/dist/chunk-A6EAAWMK.js +50 -0
- package/dist/chunk-AHDPGRXS.js +51 -0
- package/dist/chunk-AIH3F7JV.js +76 -0
- package/dist/chunk-AIHQBQ3E.js +109 -0
- package/dist/chunk-BKGVSC6S.js +152 -0
- package/dist/chunk-COK4ZXNG.js +0 -0
- package/dist/chunk-DEEJBDJE.js +47 -0
- package/dist/chunk-DH2ZHGW2.js +53 -0
- package/dist/chunk-EBUEBEJX.js +0 -0
- package/dist/chunk-EEUBKZV4.js +54 -0
- package/dist/chunk-EQYTE7WD.js +139 -0
- package/dist/chunk-EUQATJLI.js +180 -0
- package/dist/chunk-EZC6ETFW.js +80 -0
- package/dist/chunk-EZR55KV2.js +249 -0
- package/dist/chunk-F6LCSFSU.js +31 -0
- package/dist/chunk-FOKAATUQ.js +62 -0
- package/dist/chunk-FW3IEJ7H.js +71 -0
- package/dist/chunk-G26T2PRQ.js +53 -0
- package/dist/chunk-G4NI37NN.js +257 -0
- package/dist/chunk-GCZOXUDV.js +132 -0
- package/dist/chunk-GDWEDUHO.js +55 -0
- package/dist/chunk-GL2NANFH.js +434 -0
- package/dist/chunk-GPBOMJSZ.js +136 -0
- package/dist/chunk-H5I5GWAA.js +94 -0
- package/dist/chunk-HGC4CCKB.js +29 -0
- package/dist/chunk-HV3DGSSH.js +447 -0
- package/dist/chunk-I47QEDTX.js +193 -0
- package/dist/chunk-IAJNC34M.js +102 -0
- package/dist/chunk-IHXRF3BH.js +215 -0
- package/dist/chunk-IJEZ7G7S.js +26 -0
- package/dist/chunk-IQQKKUAV.js +151 -0
- package/dist/chunk-JBCDEAMW.js +35 -0
- package/dist/chunk-JLLMTTQ4.js +75 -0
- package/dist/chunk-JS5VI3OW.js +143 -0
- package/dist/chunk-KAWVMIRJ.js +44 -0
- package/dist/chunk-KMCJIL57.js +214 -0
- package/dist/chunk-KWTBD4CM.js +145 -0
- package/dist/chunk-KXAWBFJN.js +310 -0
- package/dist/chunk-L25BNU3E.js +56 -0
- package/dist/chunk-L76O3X3D.js +197 -0
- package/dist/chunk-LNV2E4I6.js +63 -0
- package/dist/chunk-MLGO3HLS.js +329 -0
- package/dist/chunk-MRJE6OX5.js +22 -0
- package/dist/chunk-MYLGYX4K.js +57 -0
- package/dist/chunk-N4YGR5WH.js +310 -0
- package/dist/chunk-OIVXOT2X.js +80 -0
- package/dist/chunk-ORMEWXMH.js +37 -0
- package/dist/chunk-POKGHK3L.js +57 -0
- package/dist/chunk-Q7IP4JMW.js +69 -0
- package/dist/chunk-RJUVBBZG.js +27 -0
- package/dist/chunk-S73334QY.js +89 -0
- package/dist/chunk-SLG26KHZ.js +101 -0
- package/dist/chunk-SR65BF6X.js +82 -0
- package/dist/chunk-SS56XFLI.js +19 -0
- package/dist/chunk-T3LJYAMO.js +277 -0
- package/dist/chunk-TDZJ6SAI.js +34 -0
- package/dist/chunk-TEIYA7U4.js +72 -0
- package/dist/chunk-TMVS4F7E.js +88 -0
- package/dist/chunk-TRBKJ7JT.js +137 -0
- package/dist/chunk-TXGNSECL.js +84 -0
- package/dist/chunk-TZAP5T4N.js +188 -0
- package/dist/chunk-UCYQNHST.js +24 -0
- package/dist/chunk-ULF5RDDX.js +0 -0
- package/dist/chunk-UXQRU3EM.js +167 -0
- package/dist/chunk-V5K5FYU7.js +200 -0
- package/dist/chunk-VDXB5DCY.js +68 -0
- package/dist/chunk-VSGKVZB4.js +47 -0
- package/dist/chunk-VWODEQ5C.js +204 -0
- package/dist/chunk-WDUFQFDP.js +193 -0
- package/dist/chunk-WHR7HPWF.js +126 -0
- package/dist/chunk-WSQMXMTL.js +122 -0
- package/dist/chunk-XHZ5L4FO.js +103 -0
- package/dist/chunk-XPASCCUA.js +404 -0
- package/dist/chunk-XRRPEBKB.js +231 -0
- package/dist/chunk-Y2TUZFCP.js +0 -0
- package/dist/chunk-Y3OTJH2S.js +473 -0
- package/dist/chunk-YBSHN67U.js +161 -0
- package/dist/chunk-YJ3TLEW3.js +100 -0
- package/dist/chunk-YJWLWUFK.js +105 -0
- package/dist/chunk-Z4D4CMDA.js +488 -0
- package/dist/chunk-ZHVUK5OY.js +314 -0
- package/dist/chunk-ZTN4X5FN.js +29 -0
- package/dist/chunk-ZZIKRBJU.js +96 -0
- package/dist/components/ui/Alert.d.ts +12 -0
- package/dist/components/ui/Alert.js +10 -0
- package/dist/components/ui/Badge.d.ts +7 -0
- package/dist/components/ui/Badge.js +8 -0
- package/dist/components/ui/Button.d.ts +7 -0
- package/dist/components/ui/Button.js +8 -0
- package/dist/components/ui/DataTable.d.ts +103 -0
- package/dist/components/ui/DataTable.js +606 -0
- package/dist/components/ui/DomainDisplay.d.ts +12 -0
- package/dist/components/ui/DomainDisplay.js +31 -0
- package/dist/components/ui/Input.d.ts +5 -0
- package/dist/components/ui/Input.js +8 -0
- package/dist/components/ui/Label.d.ts +5 -0
- package/dist/components/ui/Label.js +8 -0
- package/dist/components/ui/Pagination.d.ts +42 -0
- package/dist/components/ui/Pagination.js +20 -0
- package/dist/components/ui/Select.d.ts +15 -0
- package/dist/components/ui/Select.js +27 -0
- package/dist/components/ui/Skeleton.d.ts +6 -0
- package/dist/components/ui/Skeleton.js +8 -0
- package/dist/components/ui/TimezoneDisplay.d.ts +22 -0
- package/dist/components/ui/TimezoneDisplay.js +83 -0
- package/dist/components/ui/Tooltip.d.ts +21 -0
- package/dist/components/ui/Tooltip.js +94 -0
- package/dist/components/ui/WorldMapChart.d.ts +17 -0
- package/dist/components/ui/WorldMapChart.js +250 -0
- package/dist/components/ui/loading-bar.d.ts +20 -0
- package/dist/components/ui/loading-bar.js +15 -0
- package/dist/constants/error-codes.d.ts +389 -0
- package/dist/constants/error-codes.js +27 -0
- package/dist/constants/index.d.ts +11 -0
- package/dist/constants/index.js +85 -0
- package/dist/constants/messages.d.ts +83 -0
- package/dist/constants/messages.js +13 -0
- package/dist/constants/pagination.d.ts +43 -0
- package/dist/constants/pagination.js +15 -0
- package/dist/constants/security.d.ts +66 -0
- package/dist/constants/security.js +23 -0
- package/dist/constants/validation.d.ts +60 -0
- package/dist/constants/validation.js +19 -0
- package/dist/error/ErrorBoundary.d.ts +47 -0
- package/dist/error/app-error.d.ts +144 -0
- package/dist/error/app-error.js +10 -0
- package/dist/error/components/EmptyState.d.ts +50 -0
- package/dist/error/components/ErrorAlert.d.ts +50 -0
- package/dist/error/components/ErrorPage.d.ts +39 -0
- package/dist/error/components/LoadingState.d.ts +37 -0
- package/dist/error/components/index.d.ts +13 -0
- package/dist/error/components/index.js +18 -0
- package/dist/error/core/locale-detector.d.ts +44 -0
- package/dist/error/core/locale-detector.js +9 -0
- package/dist/error/error-display.d.ts +55 -0
- package/dist/error/error-display.js +24 -0
- package/dist/error/error-handler.d.ts +118 -0
- package/dist/error/error-handler.js +18 -0
- package/dist/error/friendly-messages-v2.d.ts +46 -0
- package/dist/error/friendly-messages-v2.js +15 -0
- package/dist/error/friendly-messages.d.ts +22 -0
- package/dist/error/friendly-messages.js +12 -0
- package/dist/error/hooks/index.d.ts +7 -0
- package/dist/error/hooks/index.js +14 -0
- package/dist/error/hooks/useErrorHandler.d.ts +67 -0
- package/dist/error/hooks/useErrorHandler.js +14 -0
- package/dist/error/index.d.ts +26 -0
- package/dist/error/index.js +289 -0
- package/dist/error/logging/error-logger.d.ts +77 -0
- package/dist/error/logging/error-logger.js +10 -0
- package/dist/error/logging/index.d.ts +9 -0
- package/dist/error/logging/index.js +35 -0
- package/dist/error/logging/transports/base.d.ts +30 -0
- package/dist/error/logging/transports/base.js +7 -0
- package/dist/error/logging/transports/console.d.ts +40 -0
- package/dist/error/logging/transports/console.js +9 -0
- package/dist/error/logging/transports/file.d.ts +49 -0
- package/dist/error/logging/transports/file.js +8 -0
- package/dist/error/logging/transports/index.d.ts +12 -0
- package/dist/error/logging/transports/index.js +25 -0
- package/dist/error/logging/transports/sentry.d.ts +44 -0
- package/dist/error/logging/transports/sentry.js +9 -0
- package/dist/error/logging/transports/slack.d.ts +51 -0
- package/dist/error/logging/transports/slack.js +9 -0
- package/dist/error/logging/types.d.ts +83 -0
- package/dist/error/logging/types.js +7 -0
- package/dist/error/messages/en.d.ts +5 -0
- package/dist/error/messages/en.js +7 -0
- package/dist/error/messages/index.d.ts +40 -0
- package/dist/error/messages/index.js +17 -0
- package/dist/error/messages/ko.d.ts +5 -0
- package/dist/error/messages/ko.js +7 -0
- package/dist/error/messages/types.d.ts +30 -0
- package/dist/error/messages/types.js +0 -0
- package/dist/error/recovery/circuit-breaker.d.ts +85 -0
- package/dist/error/recovery/circuit-breaker.js +9 -0
- package/dist/error/recovery/degradation.d.ts +56 -0
- package/dist/error/recovery/degradation.js +7 -0
- package/dist/error/recovery/fallback.d.ts +55 -0
- package/dist/error/recovery/fallback.js +11 -0
- package/dist/error/recovery/index.d.ts +12 -0
- package/dist/error/recovery/index.js +26 -0
- package/dist/error/recovery/retry.d.ts +44 -0
- package/dist/error/recovery/retry.js +7 -0
- package/dist/geolocation/batch-processor.d.ts +33 -0
- package/dist/geolocation/batch-processor.js +10 -0
- package/dist/geolocation/index.d.ts +14 -0
- package/dist/geolocation/index.js +36 -0
- package/dist/geolocation/providers/base-provider.d.ts +33 -0
- package/dist/geolocation/providers/base-provider.js +9 -0
- package/dist/geolocation/providers/index.d.ts +54 -0
- package/dist/geolocation/providers/index.js +29 -0
- package/dist/geolocation/providers/ip-api-provider.d.ts +17 -0
- package/dist/geolocation/providers/ip-api-provider.js +8 -0
- package/dist/geolocation/providers/ipapi-co-provider.d.ts +17 -0
- package/dist/geolocation/providers/ipapi-co-provider.js +8 -0
- package/dist/geolocation/providers/ipgeolocation-provider.d.ts +18 -0
- package/dist/geolocation/providers/ipgeolocation-provider.js +8 -0
- package/dist/geolocation/providers/maxmind-provider.d.ts +18 -0
- package/dist/geolocation/providers/maxmind-provider.js +8 -0
- package/dist/hooks/useDataTable.d.ts +51 -0
- package/dist/hooks/useDataTable.js +149 -0
- package/dist/hooks/useDebounce.d.ts +7 -0
- package/dist/hooks/useDebounce.js +7 -0
- package/dist/hooks/useExitIntent.d.ts +35 -0
- package/dist/hooks/useExitIntent.js +72 -0
- package/dist/hooks/useTimezone.d.ts +19 -0
- package/dist/hooks/useTimezone.js +11 -0
- package/dist/logger/logger.d.ts +11 -0
- package/dist/logger/logger.js +17 -0
- package/dist/middleware/auth.d.ts +87 -0
- package/dist/middleware/auth.js +20 -0
- package/dist/middleware/cors.d.ts +30 -0
- package/dist/middleware/cors.js +10 -0
- package/dist/middleware/error-handler.d.ts +23 -0
- package/dist/middleware/error-handler.js +13 -0
- package/dist/middleware/index.d.ts +16 -0
- package/dist/middleware/index.js +72 -0
- package/dist/middleware/init-request.d.ts +18 -0
- package/dist/middleware/init-request.js +8 -0
- package/dist/middleware/middleware-chain.d.ts +53 -0
- package/dist/middleware/middleware-chain.js +8 -0
- package/dist/middleware/rate-limit.d.ts +82 -0
- package/dist/middleware/rate-limit.js +14 -0
- package/dist/middleware/response-logger.d.ts +22 -0
- package/dist/middleware/response-logger.js +8 -0
- package/dist/middleware/security.d.ts +31 -0
- package/dist/middleware/security.js +9 -0
- package/dist/middleware/types.d.ts +45 -0
- package/dist/middleware/types.js +0 -0
- package/dist/middleware/wrappers.d.ts +91 -0
- package/dist/middleware/wrappers.js +32 -0
- package/dist/storage/r2-storage.d.ts +38 -0
- package/dist/storage/r2-storage.js +105 -0
- package/dist/system/cpu.d.ts +2 -0
- package/dist/system/cpu.js +9 -0
- package/dist/system/disk.d.ts +2 -0
- package/dist/system/disk.js +9 -0
- package/dist/system/environment.d.ts +8 -0
- package/dist/system/environment.js +9 -0
- package/dist/system/health-check.d.ts +26 -0
- package/dist/system/health-check.js +10 -0
- package/dist/system/index.d.ts +51 -0
- package/dist/system/index.js +194 -0
- package/dist/system/memory.d.ts +2 -0
- package/dist/system/memory.js +9 -0
- package/dist/system/network.d.ts +2 -0
- package/dist/system/network.js +9 -0
- package/dist/system/types.d.ts +93 -0
- package/dist/system/types.js +0 -0
- package/dist/system/utils.d.ts +12 -0
- package/dist/system/utils.js +26 -0
- package/dist/types/api.d.ts +80 -0
- package/dist/types/api.js +0 -0
- package/dist/types/database.d.ts +38 -0
- package/dist/types/database.js +0 -0
- package/dist/types/env.d.ts +105 -0
- package/dist/types/env.js +0 -0
- package/dist/types/geoip.d.ts +152 -0
- package/dist/types/geoip.js +0 -0
- package/dist/types/i18n.d.ts +11 -0
- package/dist/types/i18n.js +0 -0
- package/dist/types/qr-code.d.ts +139 -0
- package/dist/types/qr-code.js +75 -0
- package/dist/types/user.d.ts +54 -0
- package/dist/types/user.js +0 -0
- package/dist/utils/api-helpers.d.ts +147 -0
- package/dist/utils/api-helpers.js +30 -0
- package/dist/utils/client/client-utils.d.ts +3 -0
- package/dist/utils/client/client-utils.js +9 -0
- package/dist/utils/client/qr-code.d.ts +16 -0
- package/dist/utils/client/qr-code.js +215 -0
- package/dist/utils/cors.d.ts +40 -0
- package/dist/utils/cors.js +21 -0
- package/dist/utils/csv-export.d.ts +97 -0
- package/dist/utils/csv-export.js +20 -0
- package/dist/utils/error-message-formatter.d.ts +17 -0
- package/dist/utils/error-message-formatter.js +11 -0
- package/dist/utils/error-processor.d.ts +70 -0
- package/dist/utils/error-processor.js +34 -0
- package/dist/utils/format-number.d.ts +17 -0
- package/dist/utils/format-number.js +9 -0
- package/dist/utils/index.d.ts +13 -0
- package/dist/utils/index.js +160 -0
- package/dist/utils/input-validation.d.ts +88 -0
- package/dist/utils/input-validation.js +223 -0
- package/dist/utils/ip-utils.d.ts +15 -0
- package/dist/utils/ip-utils.js +91 -0
- package/dist/utils/optimistic-lock.d.ts +27 -0
- package/dist/utils/optimistic-lock.js +16 -0
- package/dist/utils/sanitizer.d.ts +72 -0
- package/dist/utils/sanitizer.js +19 -0
- package/dist/utils/shared-utils.d.ts +25 -0
- package/dist/utils/shared-utils.js +43 -0
- package/dist/utils/short-code-generator.d.ts +24 -0
- package/dist/utils/short-code-generator.js +9 -0
- package/dist/utils/timezone.d.ts +56 -0
- package/dist/utils/timezone.js +29 -0
- package/dist/utils/type-guards.d.ts +164 -0
- package/dist/utils/type-guards.js +59 -0
- package/dist/utils/url-normalizer.d.ts +53 -0
- package/dist/utils/url-normalizer.js +21 -0
- package/dist/validators/index.d.ts +7 -0
- package/dist/validators/index.js +13 -0
- package/dist/validators/password-validator.d.ts +86 -0
- package/dist/validators/password-validator.js +13 -0
- package/dist/world_countries-C2WUL2CQ.js +279 -0
- package/package.json +129 -0
|
@@ -0,0 +1,87 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 인증 미들웨어
|
|
3
|
+
*
|
|
4
|
+
* - JWT 토큰 검증
|
|
5
|
+
* - Access Token 블랙리스트 체크
|
|
6
|
+
* - 사용자 정보 context에 추가
|
|
7
|
+
* - 인증 실패 시 401 에러
|
|
8
|
+
*
|
|
9
|
+
* 완전 독립적 패키지:
|
|
10
|
+
* @withwiz/auth/core/jwt를 사용하여 비즈니스 로직에 의존하지 않음
|
|
11
|
+
*/
|
|
12
|
+
import type { TApiMiddleware } from "./types";
|
|
13
|
+
/**
|
|
14
|
+
* Access Token 블랙리스트 체커 인터페이스
|
|
15
|
+
* src/lib/services/auth/refreshTokenService에서 구현체 주입
|
|
16
|
+
*/
|
|
17
|
+
export interface IAccessTokenBlacklistChecker {
|
|
18
|
+
isAccessTokenRevoked(token: string): Promise<boolean>;
|
|
19
|
+
}
|
|
20
|
+
declare global {
|
|
21
|
+
var __accessTokenBlacklistChecker: IAccessTokenBlacklistChecker | undefined;
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Access Token 블랙리스트 체커 설정
|
|
25
|
+
* 애플리케이션 시작 시 refreshTokenService를 주입
|
|
26
|
+
*/
|
|
27
|
+
export declare function setAccessTokenBlacklistChecker(checker: IAccessTokenBlacklistChecker): void;
|
|
28
|
+
/**
|
|
29
|
+
* Auth Middleware 명시적 초기화
|
|
30
|
+
*
|
|
31
|
+
* instrumentation.ts에서 서버 시작 시 호출하여 JWT Manager를 미리 초기화합니다.
|
|
32
|
+
*
|
|
33
|
+
* @returns {boolean} 초기화 성공 여부
|
|
34
|
+
*
|
|
35
|
+
* @example
|
|
36
|
+
* ```typescript
|
|
37
|
+
* // instrumentation.ts
|
|
38
|
+
* import { initializeAuthMiddleware } from '@withwiz/middleware/auth';
|
|
39
|
+
*
|
|
40
|
+
* export async function register() {
|
|
41
|
+
* initializeAuthMiddleware();
|
|
42
|
+
* }
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
export declare function initializeAuthMiddleware(): boolean;
|
|
46
|
+
/**
|
|
47
|
+
* 인증 미들웨어
|
|
48
|
+
*
|
|
49
|
+
* Authorization 헤더에서 JWT 토큰을 추출하고 검증합니다.
|
|
50
|
+
* 검증된 사용자 정보를 context.user에 추가합니다.
|
|
51
|
+
*
|
|
52
|
+
* @example
|
|
53
|
+
* ```typescript
|
|
54
|
+
* const chain = new MiddlewareChain()
|
|
55
|
+
* .use(authMiddleware);
|
|
56
|
+
* ```
|
|
57
|
+
*/
|
|
58
|
+
export declare const authMiddleware: TApiMiddleware;
|
|
59
|
+
/**
|
|
60
|
+
* 선택적 인증 미들웨어
|
|
61
|
+
*
|
|
62
|
+
* Authorization 헤더가 있으면 JWT 토큰을 검증하고 context.user를 설정합니다.
|
|
63
|
+
* 토큰이 없거나 유효하지 않아도 에러를 발생시키지 않고 계속 진행합니다.
|
|
64
|
+
* 공개 API이지만 로그인 사용자를 선택적으로 인식해야 하는 경우에 사용합니다.
|
|
65
|
+
*
|
|
66
|
+
* @example
|
|
67
|
+
* ```typescript
|
|
68
|
+
* const chain = new MiddlewareChain()
|
|
69
|
+
* .use(optionalAuthMiddleware);
|
|
70
|
+
* // context.user가 설정되면 로그인 사용자, 아니면 비로그인
|
|
71
|
+
* ```
|
|
72
|
+
*/
|
|
73
|
+
export declare const optionalAuthMiddleware: TApiMiddleware;
|
|
74
|
+
/**
|
|
75
|
+
* 관리자 권한 검증 미들웨어
|
|
76
|
+
*
|
|
77
|
+
* authMiddleware 이후에 실행되어야 합니다.
|
|
78
|
+
* context.user가 없거나 role이 admin이 아니면 403 에러를 발생시킵니다.
|
|
79
|
+
*
|
|
80
|
+
* @example
|
|
81
|
+
* ```typescript
|
|
82
|
+
* const chain = new MiddlewareChain()
|
|
83
|
+
* .use(authMiddleware)
|
|
84
|
+
* .use(adminMiddleware);
|
|
85
|
+
* ```
|
|
86
|
+
*/
|
|
87
|
+
export declare const adminMiddleware: TApiMiddleware;
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import {
|
|
2
|
+
adminMiddleware,
|
|
3
|
+
authMiddleware,
|
|
4
|
+
initializeAuthMiddleware,
|
|
5
|
+
optionalAuthMiddleware,
|
|
6
|
+
setAccessTokenBlacklistChecker
|
|
7
|
+
} from "../chunk-UXQRU3EM.js";
|
|
8
|
+
import "../chunk-MLGO3HLS.js";
|
|
9
|
+
import "../chunk-Y3OTJH2S.js";
|
|
10
|
+
import "../chunk-T3LJYAMO.js";
|
|
11
|
+
import "../chunk-AIH3F7JV.js";
|
|
12
|
+
import "../chunk-EZR55KV2.js";
|
|
13
|
+
import "../chunk-ORMEWXMH.js";
|
|
14
|
+
export {
|
|
15
|
+
adminMiddleware,
|
|
16
|
+
authMiddleware,
|
|
17
|
+
initializeAuthMiddleware,
|
|
18
|
+
optionalAuthMiddleware,
|
|
19
|
+
setAccessTokenBlacklistChecker
|
|
20
|
+
};
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* CORS 미들웨어
|
|
3
|
+
*
|
|
4
|
+
* Cross-Origin Resource Sharing 헤더를 설정합니다.
|
|
5
|
+
*/
|
|
6
|
+
import type { TApiMiddleware } from './types';
|
|
7
|
+
/**
|
|
8
|
+
* CORS 미들웨어
|
|
9
|
+
*
|
|
10
|
+
* - Origin 검증 및 CORS 헤더 설정
|
|
11
|
+
* - OPTIONS preflight 요청 처리
|
|
12
|
+
* - 크레덴셜 허용 설정
|
|
13
|
+
*/
|
|
14
|
+
export declare const corsMiddleware: TApiMiddleware;
|
|
15
|
+
/**
|
|
16
|
+
* CORS 설정 검증 및 초기화
|
|
17
|
+
*
|
|
18
|
+
* instrumentation.ts에서 서버 시작 시 호출하여 CORS 설정을 검증하고 로그를 출력합니다.
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* // instrumentation.ts
|
|
23
|
+
* import { validateCorsConfiguration } from '@withwiz/middleware/cors';
|
|
24
|
+
*
|
|
25
|
+
* export async function register() {
|
|
26
|
+
* validateCorsConfiguration();
|
|
27
|
+
* }
|
|
28
|
+
* ```
|
|
29
|
+
*/
|
|
30
|
+
export declare function validateCorsConfiguration(): void;
|
|
@@ -0,0 +1,23 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 에러 핸들러 미들웨어
|
|
3
|
+
*
|
|
4
|
+
* - 모든 에러를 잡아서 표준 형식의 JSON 응답으로 변환
|
|
5
|
+
* - AppError를 감지하여 적절한 HTTP 상태 코드 반환
|
|
6
|
+
* - ZodError를 감지하여 400 Bad Request 반환
|
|
7
|
+
* - 다중 언어 메시지 지원
|
|
8
|
+
*/
|
|
9
|
+
import type { TApiMiddleware } from './types';
|
|
10
|
+
/**
|
|
11
|
+
* 에러 핸들러 미들웨어
|
|
12
|
+
*
|
|
13
|
+
* 체인의 최상위에 배치하여 모든 에러를 캐치합니다.
|
|
14
|
+
*
|
|
15
|
+
* @example
|
|
16
|
+
* ```typescript
|
|
17
|
+
* const chain = new MiddlewareChain()
|
|
18
|
+
* .use(errorHandlerMiddleware) // 가장 먼저
|
|
19
|
+
* .use(initRequestMiddleware)
|
|
20
|
+
* .use(authMiddleware);
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare const errorHandlerMiddleware: TApiMiddleware;
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import {
|
|
2
|
+
errorHandlerMiddleware
|
|
3
|
+
} from "../chunk-TMVS4F7E.js";
|
|
4
|
+
import "../chunk-EEUBKZV4.js";
|
|
5
|
+
import "../chunk-N4YGR5WH.js";
|
|
6
|
+
import "../chunk-KXAWBFJN.js";
|
|
7
|
+
import "../chunk-MLGO3HLS.js";
|
|
8
|
+
import "../chunk-Y3OTJH2S.js";
|
|
9
|
+
import "../chunk-EZR55KV2.js";
|
|
10
|
+
import "../chunk-ORMEWXMH.js";
|
|
11
|
+
export {
|
|
12
|
+
errorHandlerMiddleware
|
|
13
|
+
};
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API 미들웨어 시스템
|
|
3
|
+
*
|
|
4
|
+
* 통합 에러 처리 시스템의 API 레이어
|
|
5
|
+
*/
|
|
6
|
+
export type { IApiContext, IUser, TApiHandler, TApiMiddleware, IMiddlewareChainOptions, } from './types';
|
|
7
|
+
export { MiddlewareChain } from './middleware-chain';
|
|
8
|
+
export { initRequestMiddleware } from './init-request';
|
|
9
|
+
export { authMiddleware, optionalAuthMiddleware, adminMiddleware, initializeAuthMiddleware, setAccessTokenBlacklistChecker } from './auth';
|
|
10
|
+
export type { IAccessTokenBlacklistChecker } from './auth';
|
|
11
|
+
export { rateLimitMiddleware, createRateLimitMiddleware, setRateLimitAdapter } from './rate-limit';
|
|
12
|
+
export { errorHandlerMiddleware } from './error-handler';
|
|
13
|
+
export { responseLoggerMiddleware } from './response-logger';
|
|
14
|
+
export { corsMiddleware, validateCorsConfiguration } from './cors';
|
|
15
|
+
export { securityMiddleware, validateSecurityConfiguration } from './security';
|
|
16
|
+
export { withPublicApi, withAuthApi, withAdminApi, withOptionalAuthApi, withCustomApi, } from './wrappers';
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import {
|
|
2
|
+
withAdminApi,
|
|
3
|
+
withAuthApi,
|
|
4
|
+
withCustomApi,
|
|
5
|
+
withOptionalAuthApi,
|
|
6
|
+
withPublicApi
|
|
7
|
+
} from "../chunk-SLG26KHZ.js";
|
|
8
|
+
import {
|
|
9
|
+
MiddlewareChain
|
|
10
|
+
} from "../chunk-4ODT3Q4A.js";
|
|
11
|
+
import {
|
|
12
|
+
createRateLimitMiddleware,
|
|
13
|
+
rateLimitMiddleware,
|
|
14
|
+
setRateLimitAdapter
|
|
15
|
+
} from "../chunk-H5I5GWAA.js";
|
|
16
|
+
import {
|
|
17
|
+
responseLoggerMiddleware
|
|
18
|
+
} from "../chunk-KAWVMIRJ.js";
|
|
19
|
+
import {
|
|
20
|
+
securityMiddleware,
|
|
21
|
+
validateSecurityConfiguration
|
|
22
|
+
} from "../chunk-WSQMXMTL.js";
|
|
23
|
+
import {
|
|
24
|
+
adminMiddleware,
|
|
25
|
+
authMiddleware,
|
|
26
|
+
initializeAuthMiddleware,
|
|
27
|
+
optionalAuthMiddleware,
|
|
28
|
+
setAccessTokenBlacklistChecker
|
|
29
|
+
} from "../chunk-UXQRU3EM.js";
|
|
30
|
+
import {
|
|
31
|
+
corsMiddleware,
|
|
32
|
+
validateCorsConfiguration
|
|
33
|
+
} from "../chunk-FOKAATUQ.js";
|
|
34
|
+
import {
|
|
35
|
+
errorHandlerMiddleware
|
|
36
|
+
} from "../chunk-TMVS4F7E.js";
|
|
37
|
+
import {
|
|
38
|
+
initRequestMiddleware
|
|
39
|
+
} from "../chunk-62Q7DN5G.js";
|
|
40
|
+
import "../chunk-XHZ5L4FO.js";
|
|
41
|
+
import "../chunk-EEUBKZV4.js";
|
|
42
|
+
import "../chunk-N4YGR5WH.js";
|
|
43
|
+
import "../chunk-KXAWBFJN.js";
|
|
44
|
+
import "../chunk-MLGO3HLS.js";
|
|
45
|
+
import "../chunk-Y3OTJH2S.js";
|
|
46
|
+
import "../chunk-T3LJYAMO.js";
|
|
47
|
+
import "../chunk-AIH3F7JV.js";
|
|
48
|
+
import "../chunk-EZR55KV2.js";
|
|
49
|
+
import "../chunk-ORMEWXMH.js";
|
|
50
|
+
export {
|
|
51
|
+
MiddlewareChain,
|
|
52
|
+
adminMiddleware,
|
|
53
|
+
authMiddleware,
|
|
54
|
+
corsMiddleware,
|
|
55
|
+
createRateLimitMiddleware,
|
|
56
|
+
errorHandlerMiddleware,
|
|
57
|
+
initRequestMiddleware,
|
|
58
|
+
initializeAuthMiddleware,
|
|
59
|
+
optionalAuthMiddleware,
|
|
60
|
+
rateLimitMiddleware,
|
|
61
|
+
responseLoggerMiddleware,
|
|
62
|
+
securityMiddleware,
|
|
63
|
+
setAccessTokenBlacklistChecker,
|
|
64
|
+
setRateLimitAdapter,
|
|
65
|
+
validateCorsConfiguration,
|
|
66
|
+
validateSecurityConfiguration,
|
|
67
|
+
withAdminApi,
|
|
68
|
+
withAuthApi,
|
|
69
|
+
withCustomApi,
|
|
70
|
+
withOptionalAuthApi,
|
|
71
|
+
withPublicApi
|
|
72
|
+
};
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 요청 초기화 미들웨어
|
|
3
|
+
*
|
|
4
|
+
* - requestId 생성
|
|
5
|
+
* - locale 감지
|
|
6
|
+
* - startTime 설정
|
|
7
|
+
*/
|
|
8
|
+
import type { TApiMiddleware } from './types';
|
|
9
|
+
/**
|
|
10
|
+
* 요청 초기화 미들웨어
|
|
11
|
+
*
|
|
12
|
+
* @example
|
|
13
|
+
* ```typescript
|
|
14
|
+
* const chain = new MiddlewareChain()
|
|
15
|
+
* .use(initRequestMiddleware);
|
|
16
|
+
* ```
|
|
17
|
+
*/
|
|
18
|
+
export declare const initRequestMiddleware: TApiMiddleware;
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API 미들웨어 체인
|
|
3
|
+
*
|
|
4
|
+
* Express.js 스타일의 미들웨어 체인을 Next.js API에서 사용
|
|
5
|
+
*/
|
|
6
|
+
import type { NextResponse } from 'next/server';
|
|
7
|
+
import type { IApiContext, TApiHandler, TApiMiddleware, IMiddlewareChainOptions } from './types';
|
|
8
|
+
/**
|
|
9
|
+
* 미들웨어 체인 클래스
|
|
10
|
+
*
|
|
11
|
+
* @example
|
|
12
|
+
* ```typescript
|
|
13
|
+
* const chain = new MiddlewareChain()
|
|
14
|
+
* .use(errorHandlerMiddleware)
|
|
15
|
+
* .use(initRequestMiddleware)
|
|
16
|
+
* .use(rateLimitMiddleware);
|
|
17
|
+
*
|
|
18
|
+
* const handler = async (ctx: IApiContext) => {
|
|
19
|
+
* return NextResponse.json({ data: 'Hello' });
|
|
20
|
+
* };
|
|
21
|
+
*
|
|
22
|
+
* return await chain.execute(context, handler);
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare class MiddlewareChain {
|
|
26
|
+
private middlewares;
|
|
27
|
+
private options;
|
|
28
|
+
constructor(options?: IMiddlewareChainOptions);
|
|
29
|
+
/**
|
|
30
|
+
* 미들웨어 추가
|
|
31
|
+
*/
|
|
32
|
+
use(middleware: TApiMiddleware): this;
|
|
33
|
+
/**
|
|
34
|
+
* 체인 실행
|
|
35
|
+
*
|
|
36
|
+
* @param context - API 컨텍스트
|
|
37
|
+
* @param handler - 최종 핸들러 함수
|
|
38
|
+
* @param props - Next.js 동적 라우트 파라미터 (params 등)
|
|
39
|
+
*/
|
|
40
|
+
execute(context: IApiContext, handler: TApiHandler, props?: unknown): Promise<NextResponse>;
|
|
41
|
+
/**
|
|
42
|
+
* 타임아웃 처리
|
|
43
|
+
*/
|
|
44
|
+
private withTimeout;
|
|
45
|
+
/**
|
|
46
|
+
* 미들웨어 개수 반환
|
|
47
|
+
*/
|
|
48
|
+
get length(): number;
|
|
49
|
+
/**
|
|
50
|
+
* 체인 초기화
|
|
51
|
+
*/
|
|
52
|
+
clear(): void;
|
|
53
|
+
}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Rate Limit 미들웨어
|
|
3
|
+
*
|
|
4
|
+
* - IP 기반 Rate Limiting
|
|
5
|
+
* - Redis + In-Memory Fallback
|
|
6
|
+
* - 초과 시 429 에러
|
|
7
|
+
*
|
|
8
|
+
* 의존성 주입 패턴 사용:
|
|
9
|
+
* 외부에서 Rate Limit 어댑터를 설정해야 합니다.
|
|
10
|
+
*/
|
|
11
|
+
import type { TApiMiddleware } from "./types";
|
|
12
|
+
/**
|
|
13
|
+
* Rate Limiter 인터페이스
|
|
14
|
+
*/
|
|
15
|
+
export interface IRateLimiter {
|
|
16
|
+
check: (identifier: string) => Promise<{
|
|
17
|
+
success: boolean;
|
|
18
|
+
remaining: number;
|
|
19
|
+
resetIn: number;
|
|
20
|
+
}>;
|
|
21
|
+
config: {
|
|
22
|
+
limit: number;
|
|
23
|
+
};
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Rate Limit 어댑터 인터페이스
|
|
27
|
+
*/
|
|
28
|
+
export interface IRateLimitAdapter {
|
|
29
|
+
rateLimiters: Record<string, IRateLimiter>;
|
|
30
|
+
extractClientIp: (headers: Headers) => string;
|
|
31
|
+
/** Rate Limiting 활성화 여부 (옵셔널, 미설정 시 기본 활성화) */
|
|
32
|
+
isEnabled?: (type?: string) => Promise<boolean>;
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Rate Limit 어댑터 설정
|
|
36
|
+
* @param adapter - Rate Limit 어댑터 구현체
|
|
37
|
+
*
|
|
38
|
+
* @example
|
|
39
|
+
* ```typescript
|
|
40
|
+
* import { setRateLimitAdapter } from '@withwiz/middleware/rate-limit';
|
|
41
|
+
* // 프로젝트에서 구현한 Rate Limit 유틸리티를 import하세요
|
|
42
|
+
* import { rateLimiters, extractClientIp } from '<your-project>/rateLimiter';
|
|
43
|
+
*
|
|
44
|
+
* setRateLimitAdapter({ rateLimiters, extractClientIp });
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export declare function setRateLimitAdapter(adapter: IRateLimitAdapter): void;
|
|
48
|
+
/**
|
|
49
|
+
* 기본 Rate Limit 타입 (범용)
|
|
50
|
+
*/
|
|
51
|
+
export type TRateLimitType = "api" | "auth" | "admin";
|
|
52
|
+
/**
|
|
53
|
+
* 확장 가능한 Rate Limit 타입
|
|
54
|
+
* URL Shortener 서비스 특화 타입은 extensions/url-shortener/rate-limit-types.ts에 정의
|
|
55
|
+
*/
|
|
56
|
+
export type TExtendedRateLimitType = TRateLimitType | string;
|
|
57
|
+
/**
|
|
58
|
+
* Rate Limit 미들웨어 팩토리
|
|
59
|
+
*
|
|
60
|
+
* @param type - Rate limit 타입 ('api', 'auth', 'admin' 등)
|
|
61
|
+
*
|
|
62
|
+
* @example
|
|
63
|
+
* ```typescript
|
|
64
|
+
* const chain = new MiddlewareChain()
|
|
65
|
+
* .use(createRateLimitMiddleware('api'));
|
|
66
|
+
* ```
|
|
67
|
+
*/
|
|
68
|
+
export declare function createRateLimitMiddleware(type: TExtendedRateLimitType): TApiMiddleware;
|
|
69
|
+
/**
|
|
70
|
+
* 사전 정의된 Rate Limit 미들웨어 (범용)
|
|
71
|
+
*
|
|
72
|
+
* 서비스 특화 미들웨어 (redirect, createLink 등)는
|
|
73
|
+
* 프로젝트에서 직접 createRateLimitMiddleware를 사용하여 생성하세요.
|
|
74
|
+
*/
|
|
75
|
+
export declare const rateLimitMiddleware: {
|
|
76
|
+
/** API Rate Limit (분당 120회) */
|
|
77
|
+
api: TApiMiddleware;
|
|
78
|
+
/** 인증 Rate Limit (시간당 40회) */
|
|
79
|
+
auth: TApiMiddleware;
|
|
80
|
+
/** 관리자 Rate Limit (분당 200회) */
|
|
81
|
+
admin: TApiMiddleware;
|
|
82
|
+
};
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import {
|
|
2
|
+
createRateLimitMiddleware,
|
|
3
|
+
rateLimitMiddleware,
|
|
4
|
+
setRateLimitAdapter
|
|
5
|
+
} from "../chunk-H5I5GWAA.js";
|
|
6
|
+
import "../chunk-MLGO3HLS.js";
|
|
7
|
+
import "../chunk-Y3OTJH2S.js";
|
|
8
|
+
import "../chunk-EZR55KV2.js";
|
|
9
|
+
import "../chunk-ORMEWXMH.js";
|
|
10
|
+
export {
|
|
11
|
+
createRateLimitMiddleware,
|
|
12
|
+
rateLimitMiddleware,
|
|
13
|
+
setRateLimitAdapter
|
|
14
|
+
};
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 응답 로거 미들웨어
|
|
3
|
+
*
|
|
4
|
+
* - 요청/응답 정보 로깅
|
|
5
|
+
* - 응답 시간 측정
|
|
6
|
+
* - Rate limit 헤더 추가
|
|
7
|
+
*/
|
|
8
|
+
import type { TApiMiddleware } from './types';
|
|
9
|
+
/**
|
|
10
|
+
* 응답 로거 미들웨어
|
|
11
|
+
*
|
|
12
|
+
* 요청 처리 시작부터 끝까지의 정보를 로깅합니다.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const chain = new MiddlewareChain()
|
|
17
|
+
* .use(errorHandlerMiddleware)
|
|
18
|
+
* .use(initRequestMiddleware)
|
|
19
|
+
* .use(responseLoggerMiddleware);
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export declare const responseLoggerMiddleware: TApiMiddleware;
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* 보안 미들웨어
|
|
3
|
+
*
|
|
4
|
+
* - TRACE/TRACK HTTP 메서드 차단
|
|
5
|
+
* - Content-Type 검증
|
|
6
|
+
* - 보안 헤더 강화
|
|
7
|
+
*/
|
|
8
|
+
import type { TApiMiddleware } from './types';
|
|
9
|
+
/**
|
|
10
|
+
* 보안 미들웨어
|
|
11
|
+
*
|
|
12
|
+
* - TRACE/TRACK 메서드 차단 (405 Method Not Allowed)
|
|
13
|
+
* - POST/PUT/PATCH 요청의 Content-Type 검증
|
|
14
|
+
* - 보안 헤더 추가
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* const chain = new MiddlewareChain()
|
|
19
|
+
* .use(errorHandlerMiddleware)
|
|
20
|
+
* .use(securityMiddleware) // CORS 전에 배치
|
|
21
|
+
* .use(corsMiddleware)
|
|
22
|
+
* .use(initRequestMiddleware);
|
|
23
|
+
* ```
|
|
24
|
+
*/
|
|
25
|
+
export declare const securityMiddleware: TApiMiddleware;
|
|
26
|
+
/**
|
|
27
|
+
* 보안 미들웨어 설정 검증
|
|
28
|
+
*
|
|
29
|
+
* 서버 시작 시 호출하여 보안 설정을 로깅합니다.
|
|
30
|
+
*/
|
|
31
|
+
export declare function validateSecurityConfiguration(): void;
|
|
@@ -0,0 +1,45 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API 미들웨어 타입 정의
|
|
3
|
+
*/
|
|
4
|
+
import type { NextRequest, NextResponse } from 'next/server';
|
|
5
|
+
import type { TLocale } from '@withwiz/error/messages';
|
|
6
|
+
/**
|
|
7
|
+
* 사용자 정보 (JWT 토큰에서 추출)
|
|
8
|
+
*/
|
|
9
|
+
export interface IUser {
|
|
10
|
+
id: string;
|
|
11
|
+
email: string;
|
|
12
|
+
name?: string;
|
|
13
|
+
role: 'USER' | 'ADMIN';
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* API 컨텍스트
|
|
17
|
+
* - 요청 전반에 걸쳐 공유되는 정보
|
|
18
|
+
*/
|
|
19
|
+
export interface IApiContext {
|
|
20
|
+
request: NextRequest;
|
|
21
|
+
user?: IUser;
|
|
22
|
+
locale: TLocale;
|
|
23
|
+
requestId: string;
|
|
24
|
+
startTime: number;
|
|
25
|
+
metadata: Record<string, unknown>;
|
|
26
|
+
}
|
|
27
|
+
/**
|
|
28
|
+
* API 핸들러 함수
|
|
29
|
+
* - 실제 비즈니스 로직을 처리하는 함수
|
|
30
|
+
* - props는 Next.js dynamic route params를 지원
|
|
31
|
+
*/
|
|
32
|
+
export type TApiHandler = (context: IApiContext, props?: any) => Promise<NextResponse> | NextResponse;
|
|
33
|
+
/**
|
|
34
|
+
* API 미들웨어 함수
|
|
35
|
+
* - 체인에서 실행되는 미들웨어
|
|
36
|
+
* - next()를 호출하여 다음 미들웨어로 전달
|
|
37
|
+
*/
|
|
38
|
+
export type TApiMiddleware = (context: IApiContext, next: () => Promise<NextResponse>) => Promise<NextResponse>;
|
|
39
|
+
/**
|
|
40
|
+
* 미들웨어 체인 옵션
|
|
41
|
+
*/
|
|
42
|
+
export interface IMiddlewareChainOptions {
|
|
43
|
+
continueOnError?: boolean;
|
|
44
|
+
timeout?: number;
|
|
45
|
+
}
|
|
File without changes
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* API 래퍼 함수
|
|
3
|
+
*
|
|
4
|
+
* 미들웨어 체인을 조합하여 API 핸들러를 래핑합니다.
|
|
5
|
+
*/
|
|
6
|
+
import type { NextRequest } from 'next/server';
|
|
7
|
+
import type { TApiHandler } from './types';
|
|
8
|
+
import { MiddlewareChain } from './middleware-chain';
|
|
9
|
+
/**
|
|
10
|
+
* 공개 API 래퍼
|
|
11
|
+
*
|
|
12
|
+
* - 인증 불필요
|
|
13
|
+
* - Rate limit: API (분당 120회)
|
|
14
|
+
* - 에러 핸들링, 로깅 포함
|
|
15
|
+
*
|
|
16
|
+
* @example
|
|
17
|
+
* ```typescript
|
|
18
|
+
* export const GET = withPublicApi(async (ctx) => {
|
|
19
|
+
* return NextResponse.json({ message: 'Hello' });
|
|
20
|
+
* });
|
|
21
|
+
* ```
|
|
22
|
+
*/
|
|
23
|
+
export declare function withPublicApi(handler: TApiHandler): (request: NextRequest, props?: unknown) => Promise<import("next/server").NextResponse<unknown>>;
|
|
24
|
+
/**
|
|
25
|
+
* 인증 필수 API 래퍼
|
|
26
|
+
*
|
|
27
|
+
* - JWT 인증 필수
|
|
28
|
+
* - Rate limit: API (분당 120회)
|
|
29
|
+
* - 에러 핸들링, 로깅 포함
|
|
30
|
+
*
|
|
31
|
+
* @example
|
|
32
|
+
* ```typescript
|
|
33
|
+
* export const GET = withAuthApi(async (ctx) => {
|
|
34
|
+
* const userId = ctx.user!.id;
|
|
35
|
+
* return NextResponse.json({ userId });
|
|
36
|
+
* });
|
|
37
|
+
* ```
|
|
38
|
+
*/
|
|
39
|
+
export declare function withAuthApi(handler: TApiHandler): (request: NextRequest, props?: unknown) => Promise<import("next/server").NextResponse<unknown>>;
|
|
40
|
+
/**
|
|
41
|
+
* 관리자 전용 API 래퍼
|
|
42
|
+
*
|
|
43
|
+
* - JWT 인증 + 관리자 권한 필수
|
|
44
|
+
* - Rate limit: Admin (분당 200회)
|
|
45
|
+
* - 에러 핸들링, 로깅 포함
|
|
46
|
+
*
|
|
47
|
+
* @example
|
|
48
|
+
* ```typescript
|
|
49
|
+
* export const GET = withAdminApi(async (ctx) => {
|
|
50
|
+
* // ctx.user.role === 'admin' 보장됨
|
|
51
|
+
* return NextResponse.json({ users: [...] });
|
|
52
|
+
* });
|
|
53
|
+
* ```
|
|
54
|
+
*/
|
|
55
|
+
export declare function withAdminApi(handler: TApiHandler): (request: NextRequest, props?: unknown) => Promise<import("next/server").NextResponse<unknown>>;
|
|
56
|
+
/**
|
|
57
|
+
* 선택적 인증 API 래퍼
|
|
58
|
+
*
|
|
59
|
+
* - 인증 선택적 (로그인 시 context.user 설정, 비로그인 시 무시)
|
|
60
|
+
* - Rate limit: API (분당 120회)
|
|
61
|
+
* - 에러 핸들링, 로깅 포함
|
|
62
|
+
*
|
|
63
|
+
* @example
|
|
64
|
+
* ```typescript
|
|
65
|
+
* export const POST = withOptionalAuthApi(async (ctx) => {
|
|
66
|
+
* const userId = ctx.user?.id; // 로그인 시 존재, 비로그인 시 undefined
|
|
67
|
+
* return NextResponse.json({ userId });
|
|
68
|
+
* });
|
|
69
|
+
* ```
|
|
70
|
+
*/
|
|
71
|
+
export declare function withOptionalAuthApi(handler: TApiHandler): (request: NextRequest, props?: unknown) => Promise<import("next/server").NextResponse<unknown>>;
|
|
72
|
+
/**
|
|
73
|
+
* 커스텀 미들웨어 체인 API 래퍼
|
|
74
|
+
*
|
|
75
|
+
* 사용자 정의 미들웨어 체인을 적용할 수 있습니다.
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* export const GET = withCustomApi(
|
|
80
|
+
* async (ctx) => {
|
|
81
|
+
* return NextResponse.json({ data: 'custom' });
|
|
82
|
+
* },
|
|
83
|
+
* (chain) => chain
|
|
84
|
+
* .use(errorHandlerMiddleware)
|
|
85
|
+
* .use(initRequestMiddleware)
|
|
86
|
+
* .use(rateLimitMiddleware.createLink)
|
|
87
|
+
* .use(responseLoggerMiddleware)
|
|
88
|
+
* );
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
export declare function withCustomApi(handler: TApiHandler, configureChain: (chain: MiddlewareChain) => MiddlewareChain): (request: NextRequest, props?: unknown) => Promise<import("next/server").NextResponse<unknown>>;
|