120 lines
2.2 KiB
TypeScript
120 lines
2.2 KiB
TypeScript
import {
|
|
Controller,
|
|
Post,
|
|
Body,
|
|
Headers,
|
|
HttpCode,
|
|
HttpStatus,
|
|
} from '@nestjs/common';
|
|
import { IsString, IsNotEmpty, IsOptional } from 'class-validator';
|
|
import { AuthService } from './auth.service';
|
|
|
|
class CreateAnonymousDto {
|
|
@IsOptional()
|
|
@IsString()
|
|
fingerprint?: string;
|
|
}
|
|
|
|
class SendCodeDto {
|
|
@IsNotEmpty()
|
|
@IsString()
|
|
phone: string;
|
|
}
|
|
|
|
class VerifyCodeDto {
|
|
@IsNotEmpty()
|
|
@IsString()
|
|
phone: string;
|
|
|
|
@IsNotEmpty()
|
|
@IsString()
|
|
code: string;
|
|
}
|
|
|
|
class RefreshTokenDto {
|
|
@IsNotEmpty()
|
|
@IsString()
|
|
token: string;
|
|
}
|
|
|
|
@Controller('auth')
|
|
export class AuthController {
|
|
constructor(private authService: AuthService) {}
|
|
|
|
/**
|
|
* Create anonymous session
|
|
* POST /api/v1/auth/anonymous
|
|
*/
|
|
@Post('anonymous')
|
|
@HttpCode(HttpStatus.OK)
|
|
async createAnonymousSession(@Body() dto: CreateAnonymousDto) {
|
|
const result = await this.authService.createAnonymousSession(dto.fingerprint);
|
|
return {
|
|
success: true,
|
|
data: result,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Send verification code
|
|
* POST /api/v1/auth/send-code
|
|
*/
|
|
@Post('send-code')
|
|
@HttpCode(HttpStatus.OK)
|
|
async sendVerificationCode(@Body() dto: SendCodeDto) {
|
|
const result = await this.authService.sendVerificationCode(dto.phone);
|
|
return {
|
|
success: true,
|
|
data: result,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Verify code and login
|
|
* POST /api/v1/auth/verify-phone
|
|
*/
|
|
@Post('verify-phone')
|
|
@HttpCode(HttpStatus.OK)
|
|
async verifyPhone(
|
|
@Body() dto: VerifyCodeDto,
|
|
@Headers('x-user-id') userId?: string,
|
|
) {
|
|
const result = await this.authService.verifyAndLogin(
|
|
dto.phone,
|
|
dto.code,
|
|
userId,
|
|
);
|
|
return {
|
|
success: true,
|
|
data: result,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Refresh token
|
|
* POST /api/v1/auth/refresh
|
|
*/
|
|
@Post('refresh')
|
|
@HttpCode(HttpStatus.OK)
|
|
async refreshToken(@Body() dto: RefreshTokenDto) {
|
|
const result = await this.authService.refreshToken(dto.token);
|
|
return {
|
|
success: true,
|
|
data: result,
|
|
};
|
|
}
|
|
|
|
/**
|
|
* Logout (client-side action, just acknowledge)
|
|
* POST /api/v1/auth/logout
|
|
*/
|
|
@Post('logout')
|
|
@HttpCode(HttpStatus.OK)
|
|
async logout() {
|
|
return {
|
|
success: true,
|
|
message: 'Logged out successfully',
|
|
};
|
|
}
|
|
}
|