Skip to content

Commit 48a6f24

Browse files
authored
fix: List only my vaults (#82)
* feat: Get only my vaults * fix: Add orderBy in findByUserId * refactor: Delete findAll in VaultsRepository * refactor: create CurrentUserService * refactor: remove import alias
1 parent a491b19 commit 48a6f24

File tree

5 files changed

+55
-28
lines changed

5 files changed

+55
-28
lines changed
Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
import { injectable, inject } from 'tsyringe';
2+
import { getServerSession, Session } from 'next-auth';
3+
import { authOptions } from '@lib/auth';
4+
import { UsersRepository } from '@api/infra/repositories/users.repository';
5+
import { User as UserModel } from '@prisma/generated';
6+
import { UnauthorizedError } from '@api/app/errors/unauthorized.error';
7+
import { ImpossibleCaseError } from '@api/domain/errors/impossible-case.error';
8+
9+
@injectable()
10+
export class CurrentUserService {
11+
public constructor(
12+
@inject(UsersRepository)
13+
private readonly _usersRepository: UsersRepository
14+
) {}
15+
16+
public async get(): Promise<UserModel> {
17+
const session: Session | null = await getServerSession(authOptions);
18+
19+
if (!session || !session.user?.email) {
20+
throw new UnauthorizedError();
21+
}
22+
23+
const userFound: UserModel | null = await this._usersRepository.findByEmail(
24+
{
25+
email: session.user.email,
26+
}
27+
);
28+
29+
if (!userFound) {
30+
throw new ImpossibleCaseError();
31+
}
32+
33+
return userFound;
34+
}
35+
}

src/modules/api/domain/usecases/vaults/create-vault.usecase.ts

Lines changed: 4 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,7 @@ import { VaultAlreadyExistsError } from '@api/domain/errors/vaults/vault-already
88
import { RequestedValueTooLongError } from '@api/infra/prisma/errors/requested-value-too-long.error';
99
import { VaultLabelTooLongError } from '@api/domain/errors/vaults/vault-label-too-long.error';
1010
import { CreateVaultPayloadDto } from '@shared/dto/input/payloads/create-vault.payload.dto';
11-
import { getServerSession, Session } from 'next-auth';
12-
import { authOptions } from '@lib/auth';
13-
import { UsersRepository } from '@api/infra/repositories/users.repository';
14-
import { UnauthorizedError } from '@api/app/errors/unauthorized.error';
15-
import { ImpossibleCaseError } from '@api/domain/errors/impossible-case.error';
11+
import { CurrentUserService } from '@api/domain/services/current-user.service';
1612

1713
@injectable()
1814
export class CreateVaultUseCase
@@ -21,28 +17,12 @@ export class CreateVaultUseCase
2117
public constructor(
2218
@inject(VaultsRepository)
2319
private readonly _vaultsRepository: VaultsRepository,
24-
@inject(UsersRepository)
25-
private readonly _usersRepository: UsersRepository,
20+
@inject(CurrentUserService)
21+
private readonly _currentUserService: CurrentUserService,
2622
@inject(VaultAdapter)
2723
private readonly _vaultAdapter: VaultAdapter
2824
) {}
2925

30-
private async _getCurrentUser(): Promise<UserModel> {
31-
const session: Session | null = await getServerSession(authOptions);
32-
if (!session || !session.user || !session.user.email) {
33-
throw new UnauthorizedError();
34-
}
35-
const userFound: UserModel | null = await this._usersRepository.findByEmail(
36-
{
37-
email: session.user.email,
38-
}
39-
);
40-
if (!userFound) {
41-
throw new ImpossibleCaseError();
42-
}
43-
return userFound;
44-
}
45-
4626
private async _testVaultAlreadyExists(label: string): Promise<void> {
4727
const vaultsFound: number = await this._vaultsRepository.countByLabel({
4828
label,
@@ -69,7 +49,7 @@ export class CreateVaultUseCase
6949
}
7050

7151
public async handle(input: CreateVaultPayloadDto): Promise<VaultModelDto> {
72-
const currentUser: UserModel = await this._getCurrentUser();
52+
const currentUser: UserModel = await this._currentUserService.get();
7353
await this._testVaultAlreadyExists(input.label);
7454
const vaultCreated: Vault = await this._createVaultInDatabase(
7555
input,

src/modules/api/domain/usecases/vaults/get-my-vaults.usecase.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -3,20 +3,25 @@ import type { VaultModelDto } from '@shared/dto/models/vault.model.dto';
33
import { inject, injectable } from 'tsyringe';
44
import { VaultsRepository } from '@api/infra/repositories/vaults.repository';
55
import { VaultAdapter } from '@api/app/adapters/vault.adapter';
6-
import { Vault } from '@prisma/generated';
6+
import { Vault, User } from '@prisma/generated';
7+
import { CurrentUserService } from '@api/domain/services/current-user.service';
78

89
@injectable()
910
export class GetMyVaultsUseCase implements IUseCase<VaultModelDto[]> {
1011
public constructor(
1112
@inject(VaultsRepository)
1213
private readonly _vaultsRepository: VaultsRepository,
14+
@inject(CurrentUserService)
15+
private readonly _currentUserService: CurrentUserService,
1316
@inject(VaultAdapter)
1417
private readonly _vaultAdapter: VaultAdapter
1518
) {}
1619

1720
public async handle(): Promise<VaultModelDto[]> {
18-
// TODO: To replace by find by user
19-
const myVaults: Vault[] = await this._vaultsRepository.findAll();
21+
const currentUser: User = await this._currentUserService.get();
22+
const myVaults: Vault[] = await this._vaultsRepository.findByUserId({
23+
userId: currentUser.id,
24+
});
2025
return this._vaultAdapter.getDtoListFromEntities(myVaults);
2126
}
2227
}
Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
export type VaultUserIdRecord = {
2+
userId: string;
3+
};

src/modules/api/infra/repositories/vaults.repository.ts

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,12 +5,16 @@ import prisma from '@lib/prisma';
55
import { SharedUuidRecord } from '@api/infra/records/shared/shared-uuid.record';
66
import { VaultLabelRecord } from '@api/infra/records/vaults/vault-label.record';
77
import { CreateVaultRecord } from '@api/infra/records/vaults/create-vault.record';
8+
import { VaultUserIdRecord } from '@api/infra/records/vaults/vault-user-id.record';
89

910
@injectable()
1011
export class VaultsRepository {
11-
public async findAll(): Promise<Vault[]> {
12+
public async findByUserId(record: VaultUserIdRecord): Promise<Vault[]> {
1213
return await handlePrismaRequest<Vault[]>(() =>
1314
prisma.vault.findMany({
15+
where: {
16+
userId: record.userId,
17+
},
1418
orderBy: { createdAt: 'desc' },
1519
})
1620
);

0 commit comments

Comments
 (0)