Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Somente exibir campo de Contato quando logado(staff ou user) #77

Merged

Conversation

kelvinsb
Copy link
Contributor

@kelvinsb kelvinsb commented May 11, 2024

Descrição

É necessário ocultar o dado de contato(telefone) para o público em geral e restringir para apenas usuários(STAFF e USER) para controlar melhor quem visualiza e deixar apenas para pessoal capacitado(registrado).

Solução

Como as guards atuais no controller(como @UseGuards(UserGuard)) restrigem totalmente o acesso a aquela rota para usuários registrados foi preciso

  1. Fazer um decorator(para interceptar a request) para pegar o contexto e retornar o usuário(caso tenha)
  2. Fazer uma guard para repassar o usuário para o controller
  3. No controller pegar o usuário e repassar para o service
  4. Então passar para uma função para verificar se o usuário(caso esteja logado) seja um dos permitidos(no momento todos) Basta verificar se um usuário é passado no guards(verificar se recebe do contexto de guard user, userId e sessionId)
  5. Caso seja então retorna o contact

Testes

É preciso fazer uns testes já que modifica alguns pontos e pode quebrar outros. Apesar de testar localmente e não ter quebrado nada os casos recomendados(mais impactados) foram:

  • (Logado) Testar no frontend detalhe de um abrigo: deve aparecer o contato
  • (Não Logado) Testar no frontend detalhe de um abrigo: não deve aparecer o contato

src/decorators/UserDecorator/index.ts Outdated Show resolved Hide resolved
userId?: string,
) {
if (!sessionId) return false;
if (!userId) return false;
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

esses dois ifs aqui ficaram redundantes, não?
porque se não tiver sessionId nem userId, a query abaixo já vai retornar false de qualquer jeito

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

É só uma guard clause pra se não for informada nem gastar uma query com dado inválido. Posso remover se for o caso...

@@ -35,9 +37,10 @@ export class ShelterController {
}

@Get(':id')
async show(@Param('id') id: string) {
@UseGuards(ApplyUser)
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

aqui eu acho que não precisa do ApplyUser, pode usar direto @UseGuards(UserGuard) e aí ele vai aprovar todo mundo que tenha, no mínimo, a permissão de User, visto que é uma hierarquia de permissões

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

O problema que usar o @UseGuards(UserGuard) ele vai aplicar a restrição pra rota toda em vez de apenas um atributo(o de telefone). Então usuários não logados não vão conseguir ver os detalhes do abrigo quebrando essa página.
As screens com o projeto rodando essa brach:
image
image

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

aaah sim, te entendi. faz sentido.

pergunta: o nest.js não deveria ter um "ApplyUser" nativo não?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

não sei/consegui achar, se souber como eu altero já também

async show(id: string) {
async show(id: string, user: any) {
const isLogged =
Boolean(user) && Boolean(user?.sessionId) && Boolean(user?.userId);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

essa lógica aqui está correta.
porém, não acho que a camada de service precise receber o contexto do usuário que está logado.
por isso, essa lógica deveria ficar na camada de controller e aqui o método show poderia receber um boolean por parametro chamado shouldShowContact que por padrão é false.

assim a funcionalidade segue a mesma, mas mantemos a integridade da responsabilidade da service

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Sim, é uma boa, vou alterar
Já aproveitando o gancho: será que não seria interessante já seguir o padrão repository também pra puxar essas partes do banco e deixar a camada de service somente com as regras de negócio? até facilitaria o teste de services sem precisar mockar...

src/guards/utils.ts Outdated Show resolved Hide resolved
@filipepacheco filipepacheco merged commit 43561bf into SOS-RS:develop May 13, 2024
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants