Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 2 additions & 0 deletions src/app.module.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import { ConfigModule, ConfigService } from '@nestjs/config';
import { ScheduleModule } from '@nestjs/schedule';
import { TypeOrmModule } from '@nestjs/typeorm';
import { CacheWarmingModule } from './cache-warming/cache-warming.module';
import { DailyLoginRewardsModule } from './daily-login-rewards/daily-login-rewards.module';
import { CacheJob } from './cache-warming/entities/cache-job.entity';
import { Metric } from './cache-warming/entities/metric.entity';
import { PreloadData } from './cache-warming/entities/preload-data.entity';
Expand Down Expand Up @@ -51,6 +52,7 @@ import { SubscriptionsModule } from './subscriptions/subscriptions.module';
}),
ScheduleModule.forRoot(),
CacheWarmingModule,
DailyLoginRewardsModule,
EventsModule,
JobsModule,
CdnModule,
Expand Down
113 changes: 113 additions & 0 deletions src/daily-login-rewards/daily-login-rewards.controller.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,113 @@
import {
Body,
Controller,
Get,
Param,
Patch,
Post,
UseGuards,
} from '@nestjs/common';
import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard';
import { ActiveUser } from '../auth/decorators/active-user.decorator';
import { DailyLoginRewardsService } from './daily-login-rewards.service';
import {
ClaimDailyRewardDto,
CreateCalendarDto,
UpdateCalendarDto,
} from './dto/daily-login-rewards.dto';

@Controller('daily-login-rewards')
export class DailyLoginRewardsController {
constructor(
private readonly dailyLoginRewardsService: DailyLoginRewardsService,
) {}

// ─── Calendar configuration (admin / service-to-service) ─────────────────

/**
* POST /daily-login-rewards/calendars
* Creates a new reward calendar configuration.
*/
@Post('calendars')
createCalendar(@Body() dto: CreateCalendarDto) {
return this.dailyLoginRewardsService.createCalendar(dto);
}

/**
* PATCH /daily-login-rewards/calendars/:calendarId
* Updates an existing calendar configuration.
*/
@Patch('calendars/:calendarId')
updateCalendar(
@Param('calendarId') calendarId: string,
@Body() dto: UpdateCalendarDto,
) {
return this.dailyLoginRewardsService.updateCalendar(calendarId, dto);
}

/**
* GET /daily-login-rewards/calendars
* Lists all calendar configurations.
*/
@Get('calendars')
findAllCalendars() {
return this.dailyLoginRewardsService.findAllCalendars();
}

// ─── Player endpoints (authenticated) ────────────────────────────────────

/**
* GET /daily-login-rewards/calendars/:calendarId/status
* Returns the authenticated player's current position in the reward calendar,
* including whether they have already claimed today.
*/
@Get('calendars/:calendarId/status')
@UseGuards(JwtAuthGuard)
getStatus(
@ActiveUser() user: { userId?: string; id?: string },
@Param('calendarId') calendarId: string,
@Body() body: { timezone?: string },
) {
const userId = user?.userId ?? user?.id ?? '';
return this.dailyLoginRewardsService.getStatus(
userId,
calendarId,
body?.timezone,
);
}

/**
* POST /daily-login-rewards/calendars/:calendarId/claim
* Claims today's login reward for the authenticated player.
* Idempotent: returns the existing claim when called multiple times on the
* same calendar day.
*/
@Post('calendars/:calendarId/claim')
@UseGuards(JwtAuthGuard)
claimDailyReward(
@ActiveUser() user: { userId?: string; id?: string },
@Param('calendarId') calendarId: string,
@Body() dto: ClaimDailyRewardDto,
) {
const userId = user?.userId ?? user?.id ?? '';
return this.dailyLoginRewardsService.claimDailyReward(
userId,
calendarId,
dto,
);
}

/**
* GET /daily-login-rewards/calendars/:calendarId/history
* Returns the authenticated player's full claim history for the given calendar.
*/
@Get('calendars/:calendarId/history')
@UseGuards(JwtAuthGuard)
getClaimHistory(
@ActiveUser() user: { userId?: string; id?: string },
@Param('calendarId') calendarId: string,
) {
const userId = user?.userId ?? user?.id ?? '';
return this.dailyLoginRewardsService.getClaimHistory(userId, calendarId);
}
}
23 changes: 23 additions & 0 deletions src/daily-login-rewards/daily-login-rewards.module.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,23 @@
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { AuthModule } from '../auth/auth.module';
import { LoginRewardCalendar } from './entities/login-reward-calendar.entity';
import { PlayerLoginRewardClaim } from './entities/player-login-reward-claim.entity';
import { PlayerLoginStreak } from './entities/player-login-streak.entity';
import { DailyLoginRewardsController } from './daily-login-rewards.controller';
import { DailyLoginRewardsService } from './daily-login-rewards.service';

@Module({
imports: [
TypeOrmModule.forFeature([
LoginRewardCalendar,
PlayerLoginRewardClaim,
PlayerLoginStreak,
]),
AuthModule,
],
controllers: [DailyLoginRewardsController],
providers: [DailyLoginRewardsService],
exports: [DailyLoginRewardsService],
})
export class DailyLoginRewardsModule {}
Loading