diff --git a/README.md b/README.md index 5262e12..e9987ba 100644 --- a/README.md +++ b/README.md @@ -61,8 +61,27 @@ API 文档:http://localhost:3000/api/docs ## 项目结构 ``` +apps/api/src/ +├── domains/ # 8 个业务领域 +│ ├── identity/ # 身份与权限(auth + users) +│ ├── agent/ # 代理网络 +│ ├── ledger/ # 账务账本(wallet) +│ ├── catalog/ # 赛事目录(matches) +│ ├── odds/ # 盘口赔率(markets) +│ ├── betting/ # 注单引擎 +│ ├── settlement/ # 结算引擎(含 domain/ 纯函数) +│ └── operations/ # 运营支撑(audit/cashback/content/i18n) +├── applications/ # 三端应用层(编排,不含领域规则) +│ ├── player/ +│ ├── admin/ +│ └── agent/ +├── shared/ # 基础设施 +│ ├── prisma/ +│ └── common/ +├── app.module.ts +└── main.ts + apps/ - api/ NestJS 单体后端 player/ 玩家 H5 前台 admin/ 平台后台 agent/ 代理后台 diff --git a/apps/api/src/admin/admin.module.ts b/apps/api/src/admin/admin.module.ts deleted file mode 100644 index 66d1a2e..0000000 --- a/apps/api/src/admin/admin.module.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { Module } from '@nestjs/common'; -import { AdminController } from './admin.controller'; -import { UsersModule } from '../users/users.module'; -import { AgentsModule } from '../agents/agents.module'; -import { WalletModule } from '../wallet/wallet.module'; -import { MatchesModule } from '../matches/matches.module'; -import { MarketsModule } from '../markets/markets.module'; -import { SettlementModule } from '../settlement/settlement.module'; -import { CashbackModule } from '../cashback/cashback.module'; -import { ContentModule } from '../content/content.module'; -import { I18nModule } from '../i18n/i18n.module'; -import { BetsModule } from '../bets/bets.module'; - -@Module({ - imports: [ - UsersModule, - AgentsModule, - WalletModule, - MatchesModule, - MarketsModule, - SettlementModule, - CashbackModule, - ContentModule, - I18nModule, - BetsModule, - ], - controllers: [AdminController], -}) -export class AdminModule {} diff --git a/apps/api/src/app.module.ts b/apps/api/src/app.module.ts index 81dec80..1534ef9 100644 --- a/apps/api/src/app.module.ts +++ b/apps/api/src/app.module.ts @@ -2,41 +2,33 @@ import { Module } from '@nestjs/common'; import { ConfigModule } from '@nestjs/config'; import { ScheduleModule } from '@nestjs/schedule'; import { APP_GUARD } from '@nestjs/core'; -import { JwtAuthGuard } from './auth/guards'; -import { PrismaModule } from './prisma/prisma.module'; -import { AuthModule } from './auth/auth.module'; -import { UsersModule } from './users/users.module'; -import { AgentsModule } from './agents/agents.module'; -import { WalletModule } from './wallet/wallet.module'; -import { MatchesModule } from './matches/matches.module'; -import { MarketsModule } from './markets/markets.module'; -import { BetsModule } from './bets/bets.module'; -import { SettlementModule } from './settlement/settlement.module'; -import { CashbackModule } from './cashback/cashback.module'; -import { ContentModule } from './content/content.module'; -import { I18nModule } from './i18n/i18n.module'; -import { AuditModule } from './audit/audit.module'; -import { AdminModule } from './admin/admin.module'; -import { PlayerModule } from './player/player.module'; -import { AgentPortalModule } from './agent-portal/agent-portal.module'; +import { JwtAuthGuard } from './domains/identity/guards'; +import { PrismaModule } from './shared/prisma/prisma.module'; +import { IdentityModule } from './domains/identity/identity.module'; +import { AgentsModule } from './domains/agent/agents.module'; +import { WalletModule } from './domains/ledger/wallet.module'; +import { MatchesModule } from './domains/catalog/matches.module'; +import { MarketsModule } from './domains/odds/markets.module'; +import { BetsModule } from './domains/betting/bets.module'; +import { SettlementModule } from './domains/settlement/settlement.module'; +import { OperationsModule } from './domains/operations/operations.module'; +import { AdminModule } from './applications/admin/admin.module'; +import { PlayerModule } from './applications/player/player.module'; +import { AgentPortalModule } from './applications/agent/agent-portal.module'; @Module({ imports: [ ConfigModule.forRoot({ isGlobal: true }), ScheduleModule.forRoot(), PrismaModule, - AuthModule, - UsersModule, + IdentityModule, AgentsModule, WalletModule, MatchesModule, MarketsModule, BetsModule, SettlementModule, - CashbackModule, - ContentModule, - I18nModule, - AuditModule, + OperationsModule, AdminModule, PlayerModule, AgentPortalModule, diff --git a/apps/api/src/admin/admin.controller.ts b/apps/api/src/applications/admin/admin.controller.ts similarity index 90% rename from apps/api/src/admin/admin.controller.ts rename to apps/api/src/applications/admin/admin.controller.ts index 1607a7f..5422c15 100644 --- a/apps/api/src/admin/admin.controller.ts +++ b/apps/api/src/applications/admin/admin.controller.ts @@ -9,21 +9,21 @@ import { UseGuards, } from '@nestjs/common'; import { ApiTags, ApiBearerAuth } from '@nestjs/swagger'; -import { JwtAuthGuard, AdminGuard } from '../auth/guards'; -import { ContentService } from '../content/content.service'; -import { CurrentUser } from '../common/decorators'; -import { jsonResponse } from '../common/filters'; -import { UsersService } from '../users/users.service'; -import { AgentsService } from '../agents/agents.service'; -import { WalletService } from '../wallet/wallet.service'; -import { MatchesService } from '../matches/matches.service'; -import { MarketsService } from '../markets/markets.service'; -import { SettlementService } from '../settlement/settlement.service'; -import { CashbackService } from '../cashback/cashback.service'; -import { I18nService } from '../i18n/i18n.service'; -import { AuditService } from '../audit/audit.service'; -import { BetsService } from '../bets/bets.service'; -import { PrismaService } from '../prisma/prisma.service'; +import { JwtAuthGuard, AdminGuard } from '../../domains/identity/guards'; +import { ContentService } from '../../domains/operations/content/content.service'; +import { CurrentUser } from '../../shared/common/decorators'; +import { jsonResponse } from '../../shared/common/filters'; +import { UsersService } from '../../domains/identity/users.service'; +import { AgentsService } from '../../domains/agent/agents.service'; +import { WalletService } from '../../domains/ledger/wallet.service'; +import { MatchesService } from '../../domains/catalog/matches.service'; +import { MarketsService } from '../../domains/odds/markets.service'; +import { SettlementService } from '../../domains/settlement/settlement.service'; +import { CashbackService } from '../../domains/operations/cashback/cashback.service'; +import { I18nService } from '../../domains/operations/i18n/i18n.service'; +import { AuditService } from '../../domains/operations/audit/audit.service'; +import { BetsService } from '../../domains/betting/bets.service'; +import { PrismaService } from '../../shared/prisma/prisma.service'; import { IsString, IsNumber, IsOptional, IsArray, IsBoolean, MinLength } from 'class-validator'; class CreateUserDto { diff --git a/apps/api/src/applications/admin/admin.module.ts b/apps/api/src/applications/admin/admin.module.ts new file mode 100644 index 0000000..844eac5 --- /dev/null +++ b/apps/api/src/applications/admin/admin.module.ts @@ -0,0 +1,29 @@ +import { Module } from '@nestjs/common'; +import { AdminController } from './admin.controller'; +import { UsersModule } from '../../domains/identity/users.module'; +import { AgentsModule } from '../../domains/agent/agents.module'; +import { WalletModule } from '../../domains/ledger/wallet.module'; +import { MatchesModule } from '../../domains/catalog/matches.module'; +import { MarketsModule } from '../../domains/odds/markets.module'; +import { SettlementModule } from '../../domains/settlement/settlement.module'; +import { CashbackModule } from '../../domains/operations/cashback/cashback.module'; +import { ContentModule } from '../../domains/operations/content/content.module'; +import { I18nModule } from '../../domains/operations/i18n/i18n.module'; +import { BetsModule } from '../../domains/betting/bets.module'; + +@Module({ + imports: [ + UsersModule, + AgentsModule, + WalletModule, + MatchesModule, + MarketsModule, + SettlementModule, + CashbackModule, + ContentModule, + I18nModule, + BetsModule, + ], + controllers: [AdminController], +}) +export class AdminModule {} diff --git a/apps/api/src/agent-portal/agent-portal.controller.ts b/apps/api/src/applications/agent/agent-portal.controller.ts similarity index 91% rename from apps/api/src/agent-portal/agent-portal.controller.ts rename to apps/api/src/applications/agent/agent-portal.controller.ts index 5cf3960..fcb4622 100644 --- a/apps/api/src/agent-portal/agent-portal.controller.ts +++ b/apps/api/src/applications/agent/agent-portal.controller.ts @@ -8,13 +8,13 @@ import { UseGuards, } from '@nestjs/common'; import { ApiTags, ApiBearerAuth } from '@nestjs/swagger'; -import { JwtAuthGuard, AgentGuard } from '../auth/guards'; -import { CurrentUser } from '../common/decorators'; -import { jsonResponse } from '../common/filters'; -import { AgentsService } from '../agents/agents.service'; -import { WalletService } from '../wallet/wallet.service'; -import { BetsService } from '../bets/bets.service'; -import { PrismaService } from '../prisma/prisma.service'; +import { JwtAuthGuard, AgentGuard } from '../../domains/identity/guards'; +import { CurrentUser } from '../../shared/common/decorators'; +import { jsonResponse } from '../../shared/common/filters'; +import { AgentsService } from '../../domains/agent/agents.service'; +import { WalletService } from '../../domains/ledger/wallet.service'; +import { BetsService } from '../../domains/betting/bets.service'; +import { PrismaService } from '../../shared/prisma/prisma.service'; import { IsString, IsNumber, MinLength, IsOptional } from 'class-validator'; class CreatePlayerDto { diff --git a/apps/api/src/agent-portal/agent-portal.module.ts b/apps/api/src/applications/agent/agent-portal.module.ts similarity index 55% rename from apps/api/src/agent-portal/agent-portal.module.ts rename to apps/api/src/applications/agent/agent-portal.module.ts index 9cd7cff..324b2a0 100644 --- a/apps/api/src/agent-portal/agent-portal.module.ts +++ b/apps/api/src/applications/agent/agent-portal.module.ts @@ -1,8 +1,8 @@ import { Module } from '@nestjs/common'; import { AgentPortalController } from './agent-portal.controller'; -import { AgentsModule } from '../agents/agents.module'; -import { WalletModule } from '../wallet/wallet.module'; -import { BetsModule } from '../bets/bets.module'; +import { AgentsModule } from '../../domains/agent/agents.module'; +import { WalletModule } from '../../domains/ledger/wallet.module'; +import { BetsModule } from '../../domains/betting/bets.module'; @Module({ imports: [AgentsModule, WalletModule, BetsModule], diff --git a/apps/api/src/player/player.controller.ts b/apps/api/src/applications/player/player.controller.ts similarity index 87% rename from apps/api/src/player/player.controller.ts rename to apps/api/src/applications/player/player.controller.ts index 812dc04..9c1312c 100644 --- a/apps/api/src/player/player.controller.ts +++ b/apps/api/src/applications/player/player.controller.ts @@ -8,15 +8,15 @@ import { UseGuards, } from '@nestjs/common'; import { ApiTags, ApiBearerAuth } from '@nestjs/swagger'; -import { JwtAuthGuard, PlayerGuard } from '../auth/guards'; -import { CurrentUser } from '../common/decorators'; -import { jsonResponse } from '../common/filters'; -import { UsersService } from '../users/users.service'; -import { WalletService } from '../wallet/wallet.service'; -import { MatchesService } from '../matches/matches.service'; -import { BetsService } from '../bets/bets.service'; -import { ContentService } from '../content/content.service'; -import { CashbackService } from '../cashback/cashback.service'; +import { JwtAuthGuard, PlayerGuard } from '../../domains/identity/guards'; +import { CurrentUser } from '../../shared/common/decorators'; +import { jsonResponse } from '../../shared/common/filters'; +import { UsersService } from '../../domains/identity/users.service'; +import { WalletService } from '../../domains/ledger/wallet.service'; +import { MatchesService } from '../../domains/catalog/matches.service'; +import { BetsService } from '../../domains/betting/bets.service'; +import { ContentService } from '../../domains/operations/content/content.service'; +import { CashbackService } from '../../domains/operations/cashback/cashback.service'; import { IsString, IsNumber, IsArray, ValidateNested, Min, IsOptional } from 'class-validator'; import { Type } from 'class-transformer'; diff --git a/apps/api/src/applications/player/player.module.ts b/apps/api/src/applications/player/player.module.ts new file mode 100644 index 0000000..0112cc8 --- /dev/null +++ b/apps/api/src/applications/player/player.module.ts @@ -0,0 +1,14 @@ +import { Module } from '@nestjs/common'; +import { PlayerController } from './player.controller'; +import { UsersModule } from '../../domains/identity/users.module'; +import { WalletModule } from '../../domains/ledger/wallet.module'; +import { MatchesModule } from '../../domains/catalog/matches.module'; +import { BetsModule } from '../../domains/betting/bets.module'; +import { ContentModule } from '../../domains/operations/content/content.module'; +import { CashbackModule } from '../../domains/operations/cashback/cashback.module'; + +@Module({ + imports: [UsersModule, WalletModule, MatchesModule, BetsModule, ContentModule, CashbackModule], + controllers: [PlayerController], +}) +export class PlayerModule {} diff --git a/apps/api/src/agents/agents.module.ts b/apps/api/src/domains/agent/agents.module.ts similarity index 67% rename from apps/api/src/agents/agents.module.ts rename to apps/api/src/domains/agent/agents.module.ts index e32382e..295c79f 100644 --- a/apps/api/src/agents/agents.module.ts +++ b/apps/api/src/domains/agent/agents.module.ts @@ -1,7 +1,7 @@ import { Module } from '@nestjs/common'; import { AgentsService } from './agents.service'; -import { WalletModule } from '../wallet/wallet.module'; -import { AuthModule } from '../auth/auth.module'; +import { WalletModule } from '../ledger/wallet.module'; +import { AuthModule } from '../identity/auth.module'; @Module({ imports: [WalletModule, AuthModule], diff --git a/apps/api/src/agents/agents.service.ts b/apps/api/src/domains/agent/agents.service.ts similarity index 96% rename from apps/api/src/agents/agents.service.ts rename to apps/api/src/domains/agent/agents.service.ts index 1a975c4..52f9dc6 100644 --- a/apps/api/src/agents/agents.service.ts +++ b/apps/api/src/domains/agent/agents.service.ts @@ -1,9 +1,9 @@ import { Injectable, BadRequestException, ForbiddenException } from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; -import { WalletService } from '../wallet/wallet.service'; -import { AuthService } from '../auth/auth.service'; +import { PrismaService } from '../../shared/prisma/prisma.service'; +import { WalletService } from '../ledger/wallet.service'; +import { AuthService } from '../identity/auth.service'; import { Decimal } from '@prisma/client/runtime/library'; -import { generateBatchNo } from '../common/decorators'; +import { generateBatchNo } from '../../shared/common/decorators'; @Injectable() export class AgentsService { diff --git a/apps/api/src/bets/bets.module.ts b/apps/api/src/domains/betting/bets.module.ts similarity index 78% rename from apps/api/src/bets/bets.module.ts rename to apps/api/src/domains/betting/bets.module.ts index f6166ae..25bed0c 100644 --- a/apps/api/src/bets/bets.module.ts +++ b/apps/api/src/domains/betting/bets.module.ts @@ -1,6 +1,6 @@ import { Module } from '@nestjs/common'; import { BetsService } from './bets.service'; -import { WalletModule } from '../wallet/wallet.module'; +import { WalletModule } from '../ledger/wallet.module'; @Module({ imports: [WalletModule], diff --git a/apps/api/src/bets/bets.service.ts b/apps/api/src/domains/betting/bets.service.ts similarity index 95% rename from apps/api/src/bets/bets.service.ts rename to apps/api/src/domains/betting/bets.service.ts index d9d2b1b..d8df885 100644 --- a/apps/api/src/bets/bets.service.ts +++ b/apps/api/src/domains/betting/bets.service.ts @@ -1,9 +1,9 @@ import { Injectable, BadRequestException, ConflictException } from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; -import { WalletService } from '../wallet/wallet.service'; +import { PrismaService } from '../../shared/prisma/prisma.service'; +import { WalletService } from '../ledger/wallet.service'; import { Decimal } from '@prisma/client/runtime/library'; -import { generateBetNo } from '../common/decorators'; -import { isQuarterHandicapOrTotal } from '../settlement/settlement-calculator'; +import { generateBetNo } from '../../shared/common/decorators'; +import { isQuarterHandicapOrTotal } from '../settlement/domain/settlement-calculator'; import { PARLAY_MIN_LEGS, PARLAY_MAX_LEGS } from '@thebet365/shared'; interface BetSelectionInput { diff --git a/apps/api/src/matches/matches.module.ts b/apps/api/src/domains/catalog/matches.module.ts similarity index 100% rename from apps/api/src/matches/matches.module.ts rename to apps/api/src/domains/catalog/matches.module.ts diff --git a/apps/api/src/matches/matches.service.ts b/apps/api/src/domains/catalog/matches.service.ts similarity index 98% rename from apps/api/src/matches/matches.service.ts rename to apps/api/src/domains/catalog/matches.service.ts index 97d444c..c62bd4b 100644 --- a/apps/api/src/matches/matches.service.ts +++ b/apps/api/src/domains/catalog/matches.service.ts @@ -1,6 +1,6 @@ import { Injectable, NotFoundException, BadRequestException } from '@nestjs/common'; import { Cron, CronExpression } from '@nestjs/schedule'; -import { PrismaService } from '../prisma/prisma.service'; +import { PrismaService } from '../../shared/prisma/prisma.service'; @Injectable() export class MatchesService { diff --git a/apps/api/src/auth/auth.controller.ts b/apps/api/src/domains/identity/auth.controller.ts similarity index 91% rename from apps/api/src/auth/auth.controller.ts rename to apps/api/src/domains/identity/auth.controller.ts index 11665d9..e3532a2 100644 --- a/apps/api/src/auth/auth.controller.ts +++ b/apps/api/src/domains/identity/auth.controller.ts @@ -2,9 +2,9 @@ import { Controller, Post, Body, UseGuards } from '@nestjs/common'; import { ApiTags, ApiBearerAuth } from '@nestjs/swagger'; import { AuthService } from './auth.service'; import { LoginDto, ChangePasswordDto } from './auth.dto'; -import { Public, CurrentUser } from '../common/decorators'; +import { Public, CurrentUser } from '../../shared/common/decorators'; import { JwtAuthGuard } from './guards'; -import { jsonResponse } from '../common/filters'; +import { jsonResponse } from '../../shared/common/filters'; @ApiTags('Auth') @Controller() diff --git a/apps/api/src/auth/auth.dto.ts b/apps/api/src/domains/identity/auth.dto.ts similarity index 100% rename from apps/api/src/auth/auth.dto.ts rename to apps/api/src/domains/identity/auth.dto.ts diff --git a/apps/api/src/auth/auth.module.ts b/apps/api/src/domains/identity/auth.module.ts similarity index 100% rename from apps/api/src/auth/auth.module.ts rename to apps/api/src/domains/identity/auth.module.ts diff --git a/apps/api/src/auth/auth.service.ts b/apps/api/src/domains/identity/auth.service.ts similarity index 98% rename from apps/api/src/auth/auth.service.ts rename to apps/api/src/domains/identity/auth.service.ts index ef3fb18..36bae24 100644 --- a/apps/api/src/auth/auth.service.ts +++ b/apps/api/src/domains/identity/auth.service.ts @@ -2,7 +2,7 @@ import { Injectable, UnauthorizedException, ForbiddenException } from '@nestjs/c import { JwtService } from '@nestjs/jwt'; import { ConfigService } from '@nestjs/config'; import * as bcrypt from 'bcryptjs'; -import { PrismaService } from '../prisma/prisma.service'; +import { PrismaService } from '../../shared/prisma/prisma.service'; const MAX_LOGIN_FAILS = 5; const LOCK_DURATION_MS = 15 * 60 * 1000; diff --git a/apps/api/src/auth/guards.ts b/apps/api/src/domains/identity/guards.ts similarity index 97% rename from apps/api/src/auth/guards.ts rename to apps/api/src/domains/identity/guards.ts index 3f0bfa2..52287e6 100644 --- a/apps/api/src/auth/guards.ts +++ b/apps/api/src/domains/identity/guards.ts @@ -1,7 +1,7 @@ import { Injectable, CanActivate, ExecutionContext, UnauthorizedException, ForbiddenException } from '@nestjs/common'; import { Reflector } from '@nestjs/core'; import { AuthGuard } from '@nestjs/passport'; -import { IS_PUBLIC_KEY, PERMISSIONS_KEY } from '../common/decorators'; +import { IS_PUBLIC_KEY, PERMISSIONS_KEY } from '../../shared/common/decorators'; @Injectable() export class JwtAuthGuard extends AuthGuard('jwt') { diff --git a/apps/api/src/domains/identity/identity.module.ts b/apps/api/src/domains/identity/identity.module.ts new file mode 100644 index 0000000..7fbc225 --- /dev/null +++ b/apps/api/src/domains/identity/identity.module.ts @@ -0,0 +1,9 @@ +import { Module } from '@nestjs/common'; +import { AuthModule } from './auth.module'; +import { UsersModule } from './users.module'; + +@Module({ + imports: [AuthModule, UsersModule], + exports: [AuthModule, UsersModule], +}) +export class IdentityModule {} diff --git a/apps/api/src/auth/jwt.strategy.ts b/apps/api/src/domains/identity/jwt.strategy.ts similarity index 95% rename from apps/api/src/auth/jwt.strategy.ts rename to apps/api/src/domains/identity/jwt.strategy.ts index 8431d1d..deef8ca 100644 --- a/apps/api/src/auth/jwt.strategy.ts +++ b/apps/api/src/domains/identity/jwt.strategy.ts @@ -2,7 +2,7 @@ import { Injectable, UnauthorizedException } from '@nestjs/common'; import { PassportStrategy } from '@nestjs/passport'; import { ExtractJwt, Strategy } from 'passport-jwt'; import { ConfigService } from '@nestjs/config'; -import { PrismaService } from '../prisma/prisma.service'; +import { PrismaService } from '../../shared/prisma/prisma.service'; import { JwtPayload } from './auth.service'; @Injectable() diff --git a/apps/api/src/users/users.module.ts b/apps/api/src/domains/identity/users.module.ts similarity index 100% rename from apps/api/src/users/users.module.ts rename to apps/api/src/domains/identity/users.module.ts diff --git a/apps/api/src/users/users.service.ts b/apps/api/src/domains/identity/users.service.ts similarity index 94% rename from apps/api/src/users/users.service.ts rename to apps/api/src/domains/identity/users.service.ts index 9bd7749..c308b27 100644 --- a/apps/api/src/users/users.service.ts +++ b/apps/api/src/domains/identity/users.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; +import { PrismaService } from '../../shared/prisma/prisma.service'; @Injectable() export class UsersService { diff --git a/apps/api/src/wallet/wallet.module.ts b/apps/api/src/domains/ledger/wallet.module.ts similarity index 100% rename from apps/api/src/wallet/wallet.module.ts rename to apps/api/src/domains/ledger/wallet.module.ts diff --git a/apps/api/src/wallet/wallet.service.ts b/apps/api/src/domains/ledger/wallet.service.ts similarity index 97% rename from apps/api/src/wallet/wallet.service.ts rename to apps/api/src/domains/ledger/wallet.service.ts index 262e60a..fcccab0 100644 --- a/apps/api/src/wallet/wallet.service.ts +++ b/apps/api/src/domains/ledger/wallet.service.ts @@ -1,7 +1,7 @@ import { Injectable, BadRequestException } from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; +import { PrismaService } from '../../shared/prisma/prisma.service'; import { Decimal } from '@prisma/client/runtime/library'; -import { generateTransactionId } from '../common/decorators'; +import { generateTransactionId } from '../../shared/common/decorators'; @Injectable() export class WalletService { diff --git a/apps/api/src/markets/markets.module.ts b/apps/api/src/domains/odds/markets.module.ts similarity index 100% rename from apps/api/src/markets/markets.module.ts rename to apps/api/src/domains/odds/markets.module.ts diff --git a/apps/api/src/markets/markets.service.ts b/apps/api/src/domains/odds/markets.service.ts similarity index 97% rename from apps/api/src/markets/markets.service.ts rename to apps/api/src/domains/odds/markets.service.ts index a6ba152..bc8bdf6 100644 --- a/apps/api/src/markets/markets.service.ts +++ b/apps/api/src/domains/odds/markets.service.ts @@ -1,10 +1,10 @@ import { Injectable, BadRequestException, NotFoundException } from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; +import { PrismaService } from '../../shared/prisma/prisma.service'; import { Decimal } from '@prisma/client/runtime/library'; import { FT_CORRECT_SCORE_TEMPLATE, HT_CORRECT_SCORE_TEMPLATE, -} from '../settlement/settlement-calculator'; +} from '../settlement/domain/settlement-calculator'; @Injectable() export class MarketsService { diff --git a/apps/api/src/audit/audit.module.ts b/apps/api/src/domains/operations/audit/audit.module.ts similarity index 100% rename from apps/api/src/audit/audit.module.ts rename to apps/api/src/domains/operations/audit/audit.module.ts diff --git a/apps/api/src/audit/audit.service.ts b/apps/api/src/domains/operations/audit/audit.service.ts similarity index 94% rename from apps/api/src/audit/audit.service.ts rename to apps/api/src/domains/operations/audit/audit.service.ts index 177f468..f6081c7 100644 --- a/apps/api/src/audit/audit.service.ts +++ b/apps/api/src/domains/operations/audit/audit.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; +import { PrismaService } from '../../../shared/prisma/prisma.service'; @Injectable() export class AuditService { diff --git a/apps/api/src/cashback/cashback.module.ts b/apps/api/src/domains/operations/cashback/cashback.module.ts similarity index 79% rename from apps/api/src/cashback/cashback.module.ts rename to apps/api/src/domains/operations/cashback/cashback.module.ts index 1ae60a2..4bd4a26 100644 --- a/apps/api/src/cashback/cashback.module.ts +++ b/apps/api/src/domains/operations/cashback/cashback.module.ts @@ -1,6 +1,6 @@ import { Module } from '@nestjs/common'; import { CashbackService } from './cashback.service'; -import { WalletModule } from '../wallet/wallet.module'; +import { WalletModule } from '../../ledger/wallet.module'; @Module({ imports: [WalletModule], diff --git a/apps/api/src/cashback/cashback.service.ts b/apps/api/src/domains/operations/cashback/cashback.service.ts similarity index 93% rename from apps/api/src/cashback/cashback.service.ts rename to apps/api/src/domains/operations/cashback/cashback.service.ts index c38b1dc..6aaacc9 100644 --- a/apps/api/src/cashback/cashback.service.ts +++ b/apps/api/src/domains/operations/cashback/cashback.service.ts @@ -1,8 +1,8 @@ import { Injectable, BadRequestException } from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; -import { WalletService } from '../wallet/wallet.service'; +import { PrismaService } from '../../../shared/prisma/prisma.service'; +import { WalletService } from '../../ledger/wallet.service'; import { Decimal } from '@prisma/client/runtime/library'; -import { generateBatchNo } from '../common/decorators'; +import { generateBatchNo } from '../../../shared/common/decorators'; @Injectable() export class CashbackService { diff --git a/apps/api/src/content/content.module.ts b/apps/api/src/domains/operations/content/content.module.ts similarity index 100% rename from apps/api/src/content/content.module.ts rename to apps/api/src/domains/operations/content/content.module.ts diff --git a/apps/api/src/content/content.service.ts b/apps/api/src/domains/operations/content/content.service.ts similarity index 95% rename from apps/api/src/content/content.service.ts rename to apps/api/src/domains/operations/content/content.service.ts index 2398283..a175b30 100644 --- a/apps/api/src/content/content.service.ts +++ b/apps/api/src/domains/operations/content/content.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; +import { PrismaService } from '../../../shared/prisma/prisma.service'; @Injectable() export class ContentService { diff --git a/apps/api/src/i18n/i18n.module.ts b/apps/api/src/domains/operations/i18n/i18n.module.ts similarity index 100% rename from apps/api/src/i18n/i18n.module.ts rename to apps/api/src/domains/operations/i18n/i18n.module.ts diff --git a/apps/api/src/i18n/i18n.service.ts b/apps/api/src/domains/operations/i18n/i18n.service.ts similarity index 95% rename from apps/api/src/i18n/i18n.service.ts rename to apps/api/src/domains/operations/i18n/i18n.service.ts index b2f980a..fae834a 100644 --- a/apps/api/src/i18n/i18n.service.ts +++ b/apps/api/src/domains/operations/i18n/i18n.service.ts @@ -1,5 +1,5 @@ import { Injectable } from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; +import { PrismaService } from '../../../shared/prisma/prisma.service'; import { DEFAULT_LOCALE } from '@thebet365/shared'; const FALLBACK_ORDER = ['en-US', 'zh-CN', 'ms-MY']; diff --git a/apps/api/src/domains/operations/operations.module.ts b/apps/api/src/domains/operations/operations.module.ts new file mode 100644 index 0000000..e007d4a --- /dev/null +++ b/apps/api/src/domains/operations/operations.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { AuditModule } from './audit/audit.module'; +import { CashbackModule } from './cashback/cashback.module'; +import { ContentModule } from './content/content.module'; +import { I18nModule } from './i18n/i18n.module'; + +@Module({ + imports: [AuditModule, CashbackModule, ContentModule, I18nModule], + exports: [AuditModule, CashbackModule, ContentModule, I18nModule], +}) +export class OperationsModule {} diff --git a/apps/api/src/settlement/settlement-calculator.spec.ts b/apps/api/src/domains/settlement/domain/settlement-calculator.spec.ts similarity index 100% rename from apps/api/src/settlement/settlement-calculator.spec.ts rename to apps/api/src/domains/settlement/domain/settlement-calculator.spec.ts diff --git a/apps/api/src/settlement/settlement-calculator.ts b/apps/api/src/domains/settlement/domain/settlement-calculator.ts similarity index 100% rename from apps/api/src/settlement/settlement-calculator.ts rename to apps/api/src/domains/settlement/domain/settlement-calculator.ts diff --git a/apps/api/src/settlement/settlement.module.ts b/apps/api/src/domains/settlement/settlement.module.ts similarity index 69% rename from apps/api/src/settlement/settlement.module.ts rename to apps/api/src/domains/settlement/settlement.module.ts index d8be42a..2103413 100644 --- a/apps/api/src/settlement/settlement.module.ts +++ b/apps/api/src/domains/settlement/settlement.module.ts @@ -1,7 +1,7 @@ import { Module } from '@nestjs/common'; import { SettlementService } from './settlement.service'; -import { WalletModule } from '../wallet/wallet.module'; -import { AgentsModule } from '../agents/agents.module'; +import { WalletModule } from '../ledger/wallet.module'; +import { AgentsModule } from '../agent/agents.module'; @Module({ imports: [WalletModule, AgentsModule], diff --git a/apps/api/src/settlement/settlement.service.ts b/apps/api/src/domains/settlement/settlement.service.ts similarity index 97% rename from apps/api/src/settlement/settlement.service.ts rename to apps/api/src/domains/settlement/settlement.service.ts index 3ab13d2..7213e1e 100644 --- a/apps/api/src/settlement/settlement.service.ts +++ b/apps/api/src/domains/settlement/settlement.service.ts @@ -1,9 +1,9 @@ import { Injectable, BadRequestException, NotFoundException } from '@nestjs/common'; -import { PrismaService } from '../prisma/prisma.service'; -import { WalletService } from '../wallet/wallet.service'; -import { AgentsService } from '../agents/agents.service'; +import { PrismaService } from '../../shared/prisma/prisma.service'; +import { WalletService } from '../ledger/wallet.service'; +import { AgentsService } from '../agent/agents.service'; import { Decimal } from '@prisma/client/runtime/library'; -import { generateBatchNo } from '../common/decorators'; +import { generateBatchNo } from '../../shared/common/decorators'; import { settleSelection, calculatePayout, @@ -11,7 +11,7 @@ import { ScoreInput, FT_CORRECT_SCORE_TEMPLATE, HT_CORRECT_SCORE_TEMPLATE, -} from './settlement-calculator'; +} from './domain/settlement-calculator'; @Injectable() export class SettlementService { diff --git a/apps/api/src/integration.spec.ts b/apps/api/src/integration.spec.ts index e00f0f4..11f693b 100644 --- a/apps/api/src/integration.spec.ts +++ b/apps/api/src/integration.spec.ts @@ -2,7 +2,7 @@ import { settleSelection, calculatePayout, isQuarterHandicapOrTotal, -} from './settlement/settlement-calculator'; +} from './domains/settlement/domain/settlement-calculator'; /** * Agent credit & wallet integration scenarios (A001-A007) diff --git a/apps/api/src/player/player.module.ts b/apps/api/src/player/player.module.ts deleted file mode 100644 index 9cb8f27..0000000 --- a/apps/api/src/player/player.module.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { Module } from '@nestjs/common'; -import { PlayerController } from './player.controller'; -import { UsersModule } from '../users/users.module'; -import { WalletModule } from '../wallet/wallet.module'; -import { MatchesModule } from '../matches/matches.module'; -import { BetsModule } from '../bets/bets.module'; -import { ContentModule } from '../content/content.module'; -import { CashbackModule } from '../cashback/cashback.module'; - -@Module({ - imports: [UsersModule, WalletModule, MatchesModule, BetsModule, ContentModule, CashbackModule], - controllers: [PlayerController], -}) -export class PlayerModule {} diff --git a/apps/api/src/common/decorators.ts b/apps/api/src/shared/common/decorators.ts similarity index 100% rename from apps/api/src/common/decorators.ts rename to apps/api/src/shared/common/decorators.ts diff --git a/apps/api/src/common/filters.ts b/apps/api/src/shared/common/filters.ts similarity index 100% rename from apps/api/src/common/filters.ts rename to apps/api/src/shared/common/filters.ts diff --git a/apps/api/src/prisma/prisma.module.ts b/apps/api/src/shared/prisma/prisma.module.ts similarity index 100% rename from apps/api/src/prisma/prisma.module.ts rename to apps/api/src/shared/prisma/prisma.module.ts diff --git a/apps/api/src/prisma/prisma.service.ts b/apps/api/src/shared/prisma/prisma.service.ts similarity index 100% rename from apps/api/src/prisma/prisma.service.ts rename to apps/api/src/shared/prisma/prisma.service.ts