# ๐Ÿ—๏ธ ้กน็›ฎๆžถๆž„่ฎพ่ฎก ## ๆ•ดไฝ“ๆžถๆž„ Whale Town ้‡‡็”จๅˆ†ๅฑ‚ๆžถๆž„่ฎพ่ฎก๏ผŒ็กฎไฟไปฃ็ ็š„ๅฏ็ปดๆŠคๆ€งๅ’Œๅฏๆ‰ฉๅฑ•ๆ€งใ€‚ ``` โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ API ๅฑ‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ HTTP API โ”‚ โ”‚ WebSocket โ”‚ โ”‚ GraphQL โ”‚ โ”‚ โ”‚ โ”‚ (REST) โ”‚ โ”‚ (Socket.IO) โ”‚ โ”‚ (้ข„็•™) โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ไธšๅŠก้€ป่พ‘ๅฑ‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ ็”จๆˆท่ฎค่ฏ โ”‚ โ”‚ ๆธธๆˆ้€ป่พ‘ โ”‚ โ”‚ ็คพไบคๅŠŸ่ƒฝ โ”‚ โ”‚ โ”‚ โ”‚ (Login) โ”‚ โ”‚ (Game) โ”‚ โ”‚ (Social) โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ๆ ธๅฟƒๆœๅŠกๅฑ‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ ้‚ฎไปถๆœๅŠก โ”‚ โ”‚ ้ชŒ่ฏ็ ๆœๅŠก โ”‚ โ”‚ ๆ—ฅๅฟ—ๆœๅŠก โ”‚ โ”‚ โ”‚ โ”‚ (Email) โ”‚ โ”‚ (Verification)โ”‚ โ”‚ (Logger) โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ ๆ•ฐๆฎ่ฎฟ้—ฎๅฑ‚ โ”‚ โ”‚ โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”Œโ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ” โ”‚ โ”‚ โ”‚ ็”จๆˆทๆ•ฐๆฎ โ”‚ โ”‚ Redis็ผ“ๅญ˜ โ”‚ โ”‚ ๆ–‡ไปถๅญ˜ๅ‚จ โ”‚ โ”‚ โ”‚ โ”‚ (Users) โ”‚ โ”‚ (Cache) โ”‚ โ”‚ (Files) โ”‚ โ”‚ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ โ”‚ โ””โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”€โ”˜ ``` ## ๆจกๅ—ไพ่ต–ๅ…ณ็ณป ``` AppModule โ”œโ”€โ”€ ConfigModule (ๅ…จๅฑ€้…็ฝฎ) โ”œโ”€โ”€ LoggerModule (ๆ—ฅๅฟ—็ณป็ปŸ) โ”œโ”€โ”€ RedisModule (็ผ“ๅญ˜ๆœๅŠก) โ”œโ”€โ”€ UsersModule (็”จๆˆท็ฎก็†) โ”‚ โ”œโ”€โ”€ UsersService (ๆ•ฐๆฎๅบ“ๆจกๅผ) โ”‚ โ””โ”€โ”€ UsersMemoryService (ๅ†…ๅญ˜ๆจกๅผ) โ”œโ”€โ”€ EmailModule (้‚ฎไปถๆœๅŠก) โ”œโ”€โ”€ VerificationModule (้ชŒ่ฏ็ ๆœๅŠก) โ”œโ”€โ”€ LoginCoreModule (็™ปๅฝ•ๆ ธๅฟƒ) โ””โ”€โ”€ LoginModule (็™ปๅฝ•ไธšๅŠก) ``` ## ๆ•ฐๆฎๆตๅ‘ ### ็”จๆˆทๆณจๅ†Œๆต็จ‹ ``` 1. ็”จๆˆท่ฏทๆฑ‚ โ†’ LoginController 2. ๅ‚ๆ•ฐ้ชŒ่ฏ โ†’ LoginService 3. ๅ‘้€้ชŒ่ฏ็  โ†’ LoginCoreService 4. ็”Ÿๆˆ้ชŒ่ฏ็  โ†’ VerificationService 5. ๅ‘้€้‚ฎไปถ โ†’ EmailService 6. ๅญ˜ๅ‚จ้ชŒ่ฏ็  โ†’ RedisService 7. ่ฟ”ๅ›žๅ“ๅบ” โ†’ ็”จๆˆท ``` ### ๅŒๆจกๅผๆžถๆž„ ้กน็›ฎๆ”ฏๆŒๅผ€ๅ‘ๆต‹่ฏ•ๆจกๅผๅ’Œ็”Ÿไบง้ƒจ็ฝฒๆจกๅผ็š„ๆ— ็ผๅˆ‡ๆข๏ผš #### ๅผ€ๅ‘ๆต‹่ฏ•ๆจกๅผ - **ๆ•ฐๆฎๅบ“**: ๅ†…ๅญ˜ๅญ˜ๅ‚จ (UsersMemoryService) - **็ผ“ๅญ˜**: ๆ–‡ไปถๅญ˜ๅ‚จ (FileRedisService) - **้‚ฎไปถ**: ๆŽงๅˆถๅฐ่พ“ๅ‡บ (ๆต‹่ฏ•ๆจกๅผ) - **ไผ˜ๅŠฟ**: ๆ— ้œ€ๅค–้ƒจไพ่ต–๏ผŒๅฟซ้€ŸๅฏๅŠจๆต‹่ฏ• #### ็”Ÿไบง้ƒจ็ฝฒๆจกๅผ - **ๆ•ฐๆฎๅบ“**: MySQL (UsersService + TypeORM) - **็ผ“ๅญ˜**: Redis (RealRedisService + IORedis) - **้‚ฎไปถ**: SMTPๆœๅŠกๅ™จ (็”Ÿไบงๆจกๅผ) - **ไผ˜ๅŠฟ**: ้ซ˜ๆ€ง่ƒฝ๏ผŒ้ซ˜ๅฏ็”จ๏ผŒๆ•ฐๆฎๆŒไน…ๅŒ– ## ่ฎพ่ฎกๅŽŸๅˆ™ ### 1. ๅ•ไธ€่Œ่ดฃๅŽŸๅˆ™ ๆฏไธชๆจกๅ—ๅช่ดŸ่ดฃไธ€ไธช็‰นๅฎš็š„ๅŠŸ่ƒฝ้ข†ๅŸŸ๏ผš - `LoginModule`: ๅชๅค„็†็™ปๅฝ•็›ธๅ…ณไธšๅŠก - `EmailModule`: ๅชๅค„็†้‚ฎไปถๅ‘้€ - `VerificationModule`: ๅชๅค„็†้ชŒ่ฏ็ ้€ป่พ‘ ### 2. ไพ่ต–ๆณจๅ…ฅ ไฝฟ็”จNestJS็š„ไพ่ต–ๆณจๅ…ฅ็ณป็ปŸ๏ผš - ๆŽฅๅฃๆŠฝ่ฑก: `IRedisService`, `IUsersService` - ๅฎž็Žฐๅˆ‡ๆข: ๆ นๆฎ้…็ฝฎ่‡ชๅŠจ้€‰ๆ‹ฉๅฎž็Žฐ็ฑป - ๆต‹่ฏ•ๅ‹ๅฅฝ: ๆ˜“ไบŽMockๅ’Œๅ•ๅ…ƒๆต‹่ฏ• ### 3. ้…็ฝฎ้ฉฑๅŠจ ้€š่ฟ‡็Žฏๅขƒๅ˜้‡ๆŽงๅˆถ่กŒไธบ๏ผš - `USE_FILE_REDIS`: ้€‰ๆ‹ฉRedisๅฎž็Žฐ - `DB_HOST`: ๆ•ฐๆฎๅบ“่ฟžๆŽฅ้…็ฝฎ - `EMAIL_HOST`: ้‚ฎไปถๆœๅŠก้…็ฝฎ ### 4. ้”™่ฏฏๅค„็† ็ปŸไธ€็š„้”™่ฏฏๅค„็†ๆœบๅˆถ๏ผš - HTTPๅผ‚ๅธธ: `BadRequestException`, `UnauthorizedException` - ไธšๅŠกๅผ‚ๅธธ: ่‡ชๅฎšไน‰ๅผ‚ๅธธ็ฑป - ๆ—ฅๅฟ—่ฎฐๅฝ•: ็ป“ๆž„ๅŒ–้”™่ฏฏๆ—ฅๅฟ— ## ๆ‰ฉๅฑ•ๆŒ‡ๅ— ### ๆทปๅŠ ๆ–ฐ็š„ไธšๅŠกๆจกๅ— 1. **ๅˆ›ๅปบไธšๅŠกๆจกๅ—** ```bash nest g module business/game nest g controller business/game nest g service business/game ``` 2. **ๅˆ›ๅปบๆ ธๅฟƒๆœๅŠก** ```bash nest g module core/game_core nest g service core/game_core ``` 3. **ๆทปๅŠ ๆ•ฐๆฎๆจกๅž‹** ```bash nest g module core/db/games nest g service core/db/games ``` 4. **ๆ›ดๆ–ฐไธปๆจกๅ—** ๅœจ `app.module.ts` ไธญๅฏผๅ…ฅๆ–ฐๆจกๅ— ### ๆทปๅŠ ๆ–ฐ็š„ๅทฅๅ…ทๆœๅŠก 1. **ๅˆ›ๅปบๅทฅๅ…ทๆจกๅ—** ```bash nest g module core/utils/notification nest g service core/utils/notification ``` 2. **ๅฎž็ŽฐๆœๅŠกๆŽฅๅฃ** ๅฎšไน‰ๆŠฝ่ฑกๆŽฅๅฃๅ’Œๅ…ทไฝ“ๅฎž็Žฐ 3. **ๆทปๅŠ ้…็ฝฎๆ”ฏๆŒ** ๅœจ็Žฏๅขƒๅ˜้‡ไธญๆทปๅŠ ็›ธๅ…ณ้…็ฝฎ 4. **็ผ–ๅ†™ๆต‹่ฏ•็”จไพ‹** ็กฎไฟๅŠŸ่ƒฝๆญฃ็กฎๆ€งๅ’Œไปฃ็ ่ฆ†็›–็އ ## ๆ€ง่ƒฝไผ˜ๅŒ– ### 1. ็ผ“ๅญ˜็ญ–็•ฅ - **Redis็ผ“ๅญ˜**: ้ชŒ่ฏ็ ใ€ไผš่ฏไฟกๆฏ - **ๅ†…ๅญ˜็ผ“ๅญ˜**: ้…็ฝฎไฟกๆฏใ€้™ๆ€ๆ•ฐๆฎ - **CDN็ผ“ๅญ˜**: ้™ๆ€่ต„ๆบๆ–‡ไปถ ### 2. ๆ•ฐๆฎๅบ“ไผ˜ๅŒ– - **่ฟžๆŽฅๆฑ **: ๅค็”จๆ•ฐๆฎๅบ“่ฟžๆŽฅ - **็ดขๅผ•ไผ˜ๅŒ–**: ๅ…ณ้”ฎๅญ—ๆฎตๅปบ็ซ‹็ดขๅผ• - **ๆŸฅ่ฏขไผ˜ๅŒ–**: ้ฟๅ…N+1ๆŸฅ่ฏข้—ฎ้ข˜ ### 3. ๆ—ฅๅฟ—ไผ˜ๅŒ– - **ๅผ‚ๆญฅๆ—ฅๅฟ—**: ไฝฟ็”จPino็š„ๅผ‚ๆญฅๅ†™ๅ…ฅ - **ๆ—ฅๅฟ—ๅˆ†็บง**: ็”Ÿไบง็Žฏๅขƒๅช่ฎฐๅฝ•ๅฟ…่ฆๆ—ฅๅฟ— - **ๆ—ฅๅฟ—่ฝฎ่ฝฌ**: ่‡ชๅŠจๆธ…็†่ฟ‡ๆœŸๆ—ฅๅฟ—ๆ–‡ไปถ ## ๅฎ‰ๅ…จ่€ƒ่™‘ ### 1. ๆ•ฐๆฎ้ชŒ่ฏ - **่พ“ๅ…ฅ้ชŒ่ฏ**: class-validator่ฃ…้ฅฐๅ™จ - **็ฑปๅž‹ๆฃ€ๆŸฅ**: TypeScript้™ๆ€็ฑปๅž‹ - **SQLๆณจๅ…ฅ**: TypeORMๅ‚ๆ•ฐๅŒ–ๆŸฅ่ฏข ### 2. ่ฎค่ฏๆŽˆๆƒ - **ๅฏ†็ ๅŠ ๅฏ†**: bcryptๅ“ˆๅธŒ็ฎ—ๆณ• - **ไผš่ฏ็ฎก็†**: Redisๅญ˜ๅ‚จไผš่ฏไฟกๆฏ - **ๆƒ้™ๆŽงๅˆถ**: ๅŸบไบŽ่ง’่‰ฒ็š„่ฎฟ้—ฎๆŽงๅˆถ ### 3. ้€šไฟกๅฎ‰ๅ…จ - **HTTPS**: ็”Ÿไบง็ŽฏๅขƒๅผบๅˆถHTTPS - **CORS**: ่ทจๅŸŸ่ฏทๆฑ‚ๆŽงๅˆถ - **Rate Limiting**: API่ฏทๆฑ‚้ข‘็އ้™ๅˆถ