Skip to content

Commit

Permalink
feat: 🔥 support getting secrets api
Browse files Browse the repository at this point in the history
support getting secrets api
  • Loading branch information
tal-rofe committed Jul 29, 2022
1 parent 82dee40 commit 1feba40
Show file tree
Hide file tree
Showing 10 changed files with 91 additions and 3 deletions.
12 changes: 12 additions & 0 deletions apps/backend/src/modules/database/client-secret.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,4 +31,16 @@ export class DBClientSecretService {
public async createSecret(userId: string, secret: string, label: string, expiration: Date | null) {
await this.prisma.clientSecret.create({ data: { secret, userId, label, expiration } });
}

public getSecrets(userId: string) {
return this.prisma.clientSecret.findMany({
where: { userId },
select: {
id: true,
label: true,
createdAt: true,
expiration: true,
},
});
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,11 @@ import { DeleteController } from './delete.controller';
import { EditLabelController } from './edit-label.controller';
import { QueryHandlers } from './queries/handlers';
import { EventHandlers } from './events/handlers';
import { GetAllController } from './get-all.controller';

@Module({
imports: [CqrsModule],
controllers: [CreateController, EditLabelController, DeleteController],
controllers: [CreateController, EditLabelController, DeleteController, GetAllController],
providers: [...QueryHandlers, ...CommandHandlers, ...EventHandlers, BelongingGroupGuard],
})
export class GroupsModule {}
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { Controller, Get, Logger } from '@nestjs/common';
import { QueryBus } from '@nestjs/cqrs';

import { CurrentUserId } from '@/decorators/current-user-id.decorator';

import Routes from './secrets.routes';
import type { IGetAllSecretsResponse } from './interfaces/responses';
import { GetAllSecretsContract } from './queries/contracts/get-all-secrets.contract';
import type { IUserSecretsGetAll } from './interfaces/user-secrets';

@Controller(Routes.CONTROLLER)
export class GetAllController {
private readonly logger = new Logger(GetAllController.name);

constructor(private readonly queryBus: QueryBus) {}

@Get(Routes.GET_ALL)
public async getAll(@CurrentUserId() userId: string): Promise<IGetAllSecretsResponse> {
this.logger.log(`Will try to fetch all secrets belong to use with an Id: "${userId}"`);

const userSecrets = await this.queryBus.execute<GetAllSecretsContract, IUserSecretsGetAll[]>(
new GetAllSecretsContract(userId),
);

this.logger.log(`Successfully got all secrets belong to user with an Id: "${userId}"`);

return {
secrets: userSecrets,
};
}
}
Original file line number Diff line number Diff line change
@@ -1,7 +1,13 @@
import type { IUserSecretsGetAll } from './user-secrets';

export interface ICreateClientSecret {
clientSecret: string;
}

export interface IRefreshClientSecret {
clientSecret: string;
}

export interface IGetAllSecretsResponse {
secrets: IUserSecretsGetAll[];
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
export interface IUserSecretsGetAll {
readonly id: string;
readonly label: string;
readonly expiration: number;
readonly createdAt: number;
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
export class GetAllSecretsContract {
constructor(public readonly userId: string) {}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
import { QueryHandler, type IQueryHandler } from '@nestjs/cqrs';

import { DBClientSecretService } from '@/modules/database/client-secret.service';

import { GetAllSecretsContract } from '../contracts/get-all-secrets.contract';

@QueryHandler(GetAllSecretsContract)
export class GetAllSecretsHandler implements IQueryHandler<GetAllSecretsContract> {
constructor(private readonly dbClientSecretsService: DBClientSecretService) {}

async execute(contract: GetAllSecretsContract) {
const secrets = await this.dbClientSecretsService.getSecrets(contract.userId);

return secrets.map((secret) => ({
...secret,
createdAt: secret.createdAt.getTime(),
expiration: secret.expiration ? secret.expiration.getTime() : null,
}));
}
}
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { CreateSecretHandler } from './create-secret.handler';
import { GetAllSecretsHandler } from './get-all-secrets.handler';
import { RefreshSecretHandler } from './refresh-secret.handler';

export const QueryHandlers = [CreateSecretHandler, RefreshSecretHandler];
export const QueryHandlers = [CreateSecretHandler, RefreshSecretHandler, GetAllSecretsHandler];
Original file line number Diff line number Diff line change
Expand Up @@ -5,14 +5,21 @@ import { CommandHandlers } from './commands/handlers';
import { CreateController } from './create.controller';
import { DeleteController } from './delete.controller';
import { EditSecretController } from './edit-label.controller';
import { GetAllController } from './get-all.controller';
import { BelongingSecretGuard } from './guards/belonging-secret.guard';
import { QueryHandlers } from './queries/handlers';
import { RefreshSecretController } from './refresh-secret.controller';
import { SecretsService } from './secrets.service';

@Module({
imports: [CqrsModule],
controllers: [DeleteController, RefreshSecretController, CreateController, EditSecretController],
controllers: [
DeleteController,
RefreshSecretController,
CreateController,
EditSecretController,
GetAllController,
],
providers: [...CommandHandlers, ...QueryHandlers, BelongingSecretGuard, SecretsService],
})
export class SecretsModule {}
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ const Routes = {
REVOKE_ALL: 'revoke-all',
REFRSH_SECRET: 'refresh-secret/:secret_id',
EDIT_LABEL: 'edit-label/:secret_id',
GET_ALL: 'get-all',
};

export default Routes;

0 comments on commit 1feba40

Please sign in to comment.