add register client api

This commit is contained in:
faris Aljohari
2025-03-25 10:10:08 +03:00
parent a4b743eb58
commit c5dac6c564
9 changed files with 120 additions and 0 deletions

View File

@ -0,0 +1,9 @@
import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm';
import { ClientEntity } from './entities';
@Module({
imports: [TypeOrmModule.forFeature([ClientEntity])],
exports: [TypeOrmModule],
})
export class ClientRepositoryModule {}

View File

@ -29,11 +29,13 @@ import { RoleModule } from './role/role.module';
import { TermsConditionsModule } from './terms-conditions/terms-conditions.module';
import { PrivacyPolicyModule } from './privacy-policy/privacy-policy.module';
import { TagModule } from './tags/tags.module';
import { ClientModule } from './client/client.module';
@Module({
imports: [
ConfigModule.forRoot({
load: config,
}),
ClientModule,
AuthenticationModule,
UserModule,
InviteUserModule,

View File

@ -0,0 +1,13 @@
import { Module } from '@nestjs/common';
import { ClientController } from './controllers';
import { ClientService } from './services';
import { ClientRepositoryModule } from '@app/common/modules/client/client.repository.module';
import { ClientRepository } from '@app/common/modules/client/repositories';
@Module({
imports: [ClientRepositoryModule],
controllers: [ClientController],
providers: [ClientService, ClientRepository],
exports: [ClientService],
})
export class ClientModule {}

View File

@ -0,0 +1,15 @@
import { Controller, Post, Body } from '@nestjs/common';
import { ApiTags } from '@nestjs/swagger';
import { RegisterClientDto } from '../dtos/register-client.dto';
import { ClientService } from '../services';
@ApiTags('OAuth Clients')
@Controller('clients')
export class ClientController {
constructor(private readonly clientService: ClientService) {}
@Post('register')
async registerClient(@Body() dto: RegisterClientDto) {
return this.clientService.registerClient(dto);
}
}

View File

@ -0,0 +1 @@
export * from './client.controller';

3
src/client/dtos/index.ts Normal file
View File

@ -0,0 +1,3 @@
export * from './add.community.dto';
export * from './project.param.dto';
export * from './get.community.dto';

View File

@ -0,0 +1,31 @@
import { ApiProperty } from '@nestjs/swagger';
import { IsNotEmpty, IsString } from 'class-validator';
export class RegisterClientDto {
@ApiProperty({
example: 'SmartHomeApp',
description: 'The name of the client',
required: true,
})
@IsString()
@IsNotEmpty()
name: string;
@ApiProperty({
example: 'https://client-app.com/callback',
description: 'The redirect URI of the client',
required: true,
})
@IsString()
@IsNotEmpty()
redirectUri: string;
@ApiProperty({
example: ['DEVICE_SINGLE_CONTROL', 'DEVICE_VIEW'],
description: 'The scopes of the client',
required: true,
})
@IsString({ each: true })
@IsNotEmpty({ each: true })
scopes: string[];
}

View File

@ -0,0 +1,45 @@
import { Injectable, NotFoundException } from '@nestjs/common';
import { InjectRepository } from '@nestjs/typeorm';
import { Repository } from 'typeorm';
import * as crypto from 'crypto';
import { RegisterClientDto } from '../dtos/register-client.dto';
import { ClientEntity } from '@app/common/modules/client/entities';
@Injectable()
export class ClientService {
constructor(
@InjectRepository(ClientEntity)
private clientRepository: Repository<ClientEntity>,
) {}
async registerClient(dto: RegisterClientDto) {
const clientId = crypto.randomBytes(16).toString('hex');
const clientSecret = crypto.randomBytes(32).toString('hex');
const client = this.clientRepository.create({
name: dto.name,
clientId,
clientSecret,
redirectUri: dto.redirectUri,
scopes: dto.scopes,
});
await this.clientRepository.save(client);
return { clientId, clientSecret };
}
async validateClient(
clientId: string,
clientSecret: string,
): Promise<ClientEntity | null> {
const client = await this.clientRepository.findOne({
where: { clientId, clientSecret },
});
if (!client) {
throw new NotFoundException('Invalid client credentials');
}
return client;
}
}

View File

@ -0,0 +1 @@
export * from './client.service';