Skip to content

Criar middleware check permission#884#41

Open
lgomesroc wants to merge 5 commits into
developfrom
CriarMiddlewareCheckPermission#884
Open

Criar middleware check permission#884#41
lgomesroc wants to merge 5 commits into
developfrom
CriarMiddlewareCheckPermission#884

Conversation

@lgomesroc

@lgomesroc lgomesroc commented Apr 12, 2025

Copy link
Copy Markdown
Collaborator

Foi criado o middleware CheckPermission, registrado no Kernel, aplicado nas rotas e criado duas controllers AdminDashboardController e ReportController para as permissões administrativas.

Summary by CodeRabbit

  • Novos Recursos

    • Adicionado acesso ao painel administrativo com mensagem de boas-vindas para usuários autorizados.
    • Lançada rota para consulta de relatórios via API.
  • Melhorias de Segurança

    • Implementado controle de acesso baseado em papéis e permissões, garantindo resposta adequada para acessos não autorizados.
  • Atualizações de Infraestrutura

    • Otimizada a organização das requisições e integração dos dados dos usuários, incluindo validação de e-mail e novos campos no perfil.

@coderabbitai

coderabbitai Bot commented Apr 12, 2025

Copy link
Copy Markdown

Important

Review skipped

Auto reviews are disabled on base/target branches other than the default branch.

Please check the settings in the CodeRabbit UI or the .coderabbit.yaml file in this repository. To trigger a single review, invoke the @coderabbitai review command.

You can disable this status message by setting the reviews.review_status to false in the CodeRabbit configuration file.

Walkthrough

Este conjunto de mudanças introduz novos controladores, middlewares, modelos, migrações e seeders para aprimorar a funcionalidade da API. Foram adicionados endpoints dedicados ao painel administrativo e à gestão de relatórios, além de aprimoramentos nas regras de autorização e controle de acesso via papéis e permissões. As alterações também incluem a criação e ajuste de tabelas no banco de dados, visando melhorar a estrutura e a semântica dos dados.

Changes

Arquivo(s) Resumo das alterações
app/Http/Controllers/...DashboardController.php,
app/Http/Controllers/...ReportController.php
Novos controladores com método index retornando respostas JSON para o painel administrativo e para exibição de relatórios.
app/Http/Kernel.php Nova classe Kernel configurando middleware global, grupos de middleware (web e api) e middleware de rota para verificação de papéis e permissões.
app/Http/Middleware/...CheckPermission.php,
app/Http/Middleware/...CheckRole.php
Novos middlewares para verificação de permissões e papéis durante o ciclo de requisição.
app/Models/...Permission.php,
app/Models/...Role.php,
app/Models/...User.php
Criação do modelo Permission; atualização do modelo Role com propriedade fillable e relacionamento ajustado; e inclusão de novos métodos em User (role() e hasPermission($permissionName)), para controle de acesso.
database/migrations/...create_users_table.php,
database/migrations/...add_new_fields.php
Atualizações na tabela users: inclusão da coluna email_verified_at (única) e adição de novos campos como city, state, linkedin e discord.
database/migrations/...create_permission_table.php,
database/migrations/...create_role_permission_table.php,
database/migrations/...create_permissions_table.php
Migrações para renomear/criar tabelas de permissions e criação da tabela intermediária role_permission, com inserção de registros iniciais na tabela de permissões.
database/seeders/...DatabaseSeeder.php,
database/seeders/...PermissionsSeeder.php
Atualização do seeder principal para criação condicional de usuário e adição do seeder de permissões, que insere permissões como 'Criar', 'Editar' e 'Deletar'.
routes/api.php Modificações na definição das rotas da API: inclusão de novos endpoints para /admin (e seu grupo /dashboard) e /report, com proteção via middlewares para verificação de papéis e permissões.

Sequence Diagram(s)

sequenceDiagram
  participant Cliente as Cliente
  participant API as Rota API
  participant MR as Middleware (CheckRole)
  participant ADC as AdminDashboardController

  Cliente->>API: GET /admin/dashboard
  API->>MR: Verifica papel "admin"
  MR-->>API: Retorna permissão ou 403
  API->>ADC: Chama método index
  ADC-->>API: JSON "Bem-vindo ao painel administrativo!"
  API-->>Cliente: Resposta JSON
Loading
sequenceDiagram
  participant Cliente as Cliente
  participant API as Rota API
  participant MP as Middleware (CheckPermission)
  participant RC as ReportController

  Cliente->>API: GET /report/
  API->>MP: Verifica permissão para visualização de relatórios
  MP-->>API: Retorna permissão ou 403
  API->>RC: Chama método index
  RC-->>API: JSON com mensagem sobre relatórios
  API-->>Cliente: Resposta JSON
Loading

Poem

Salto contente pelo código novo,
Sou o coelho que hoje celebra com fervor,
Rotas, migrações e modelos em harmonia,
Middlewares que garantem acesso com rigor,
No painel e nos relatórios, a magia explodiu 🐇✨
Código leve, saltitos de inovação,
Com alegria, celebro cada transformação!


🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR.
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai plan to trigger planning for file edits and PR creation.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

@rigonlucas

Copy link
Copy Markdown
Collaborator

@coderabbitai review

@coderabbitai

coderabbitai Bot commented Apr 12, 2025

Copy link
Copy Markdown
✅ Actions performed

Review triggered.

Note: CodeRabbit is an incremental review system and does not re-review already reviewed commits. This command is applicable only when automatic reviews are paused.

@coderabbitai coderabbitai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

Actionable comments posted: 18

🔭 Outside diff range comments (1)
database/migrations/2025_03_16_161750_create_role_permission_table.php (1)

1-33: ⚠️ Potential issue

Data futura no nome da migração pode causar problemas

O arquivo de migração está datado de 2025, o que está no futuro e pode causar problemas na sequência de execução das migrações.

Renomeie o arquivo de migração para usar a data atual. No Laravel, você pode usar o comando php artisan make:migration create_role_permission_table que irá criar automaticamente um arquivo com a data correta.

🧹 Nitpick comments (6)
app/Http/Middleware/CheckPermission.php (1)

14-14: Considere adicionar tipagem para o parâmetro $requiredPermission.

Para melhorar a clareza do código e aproveitar os recursos do PHP moderno, seria útil adicionar tipagem para o parâmetro $requiredPermission.

- public function handle(Request $request, Closure $next, $requiredPermission)
+ public function handle(Request $request, Closure $next, string $requiredPermission)
database/seeders/PermissionsSeeder.php (1)

10-10: Adicionar tipo de retorno ao método run.

Para melhorar a clareza do código e seguir as boas práticas do PHP moderno, considere adicionar o tipo de retorno void ao método run.

- public function run()
+ public function run(): void
app/Models/Permission.php (1)

18-20: Melhorar formatação do método belongsToMany.

A formatação atual do método belongsToMany pode ser melhorada para maior legibilidade.

- return $this->belongsToMany(Role::class, "role_permissions", "permission_id",
- "role_id");
+ return $this->belongsToMany(
+     Role::class, 
+     "role_permissions", 
+     "permission_id", 
+     "role_id"
+ );
app/Http/Controllers/ReportController.php (1)

5-7: Importação não utilizada

A classe Request está sendo importada mas não é utilizada no controlador.

use App\Http\Controllers\Controller;
-use Illuminate\Http\Request;
app/Http/Controllers/AdminDashboardController.php (1)

5-7: Importação não utilizada

A classe Request está sendo importada mas não é utilizada no controlador.

use App\Http\Controllers\Controller;
-use Illuminate\Http\Request;
app/Http/Middleware/CheckRole.php (1)

11-18: Corrigir formatação do PHPDoc.

A formatação do PHPDoc contém asteriscos extras que devem ser removidos para manter a consistência com o estilo do Laravel.

/**
-     ** Handle an incoming request.
-     * *
-     * * @param \Illuminate\Http\Request $request
-     * * @param \Closure $next
-     * * @param string $role
-     * * @return mixed
+     * Handle an incoming request.
+     *
+     * @param \Illuminate\Http\Request $request
+     * @param \Closure $next
+     * @param string $role
+     * @return mixed
 */
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between bdc2ec0 and 2e5da08.

📒 Files selected for processing (16)
  • app/Http/Controllers/AdminDashboardController.php (1 hunks)
  • app/Http/Controllers/ReportController.php (1 hunks)
  • app/Http/Kernel.php (1 hunks)
  • app/Http/Middleware/CheckPermission.php (1 hunks)
  • app/Http/Middleware/CheckRole.php (1 hunks)
  • app/Models/Permission.php (1 hunks)
  • app/Models/Role.php (1 hunks)
  • app/Models/User.php (1 hunks)
  • database/migrations/2024_01_25_210912_create_users_table.php (1 hunks)
  • database/migrations/2024_11_29_185241_add_new_fields.php (0 hunks)
  • database/migrations/2025_03_16_150203_create_permission_table.php (1 hunks)
  • database/migrations/2025_03_16_161750_create_role_permission_table.php (1 hunks)
  • database/migrations/2025_04_02_184003_create_permissions_table.php (1 hunks)
  • database/seeders/DatabaseSeeder.php (2 hunks)
  • database/seeders/PermissionsSeeder.php (1 hunks)
  • routes/api.php (4 hunks)
💤 Files with no reviewable changes (1)
  • database/migrations/2024_11_29_185241_add_new_fields.php
🧰 Additional context used
🧬 Code Graph Analysis (7)
database/seeders/PermissionsSeeder.php (1)
database/seeders/DatabaseSeeder.php (1)
  • run (15-29)
app/Models/Permission.php (1)
app/Models/Role.php (1)
  • Role (10-28)
app/Http/Controllers/AdminDashboardController.php (2)
app/Http/Controllers/Controller.php (1)
  • Controller (5-8)
app/Http/Controllers/ReportController.php (1)
  • index (10-13)
database/seeders/DatabaseSeeder.php (2)
database/seeders/PermissionsSeeder.php (1)
  • PermissionsSeeder (8-18)
app/Models/User.php (1)
  • User (12-69)
app/Http/Middleware/CheckPermission.php (2)
app/Http/Middleware/CheckRole.php (1)
  • handle (19-28)
app/Models/User.php (1)
  • hasPermission (64-67)
app/Http/Kernel.php (2)
app/Http/Middleware/CheckRole.php (1)
  • CheckRole (9-29)
app/Http/Middleware/CheckPermission.php (1)
  • CheckPermission (9-24)
app/Http/Middleware/CheckRole.php (3)
app/Http/Middleware/CheckPermission.php (1)
  • handle (14-23)
app/Models/User.php (1)
  • role (59-62)
app/Models/Permission.php (1)
  • roles (16-20)
🔇 Additional comments (18)
app/Http/Middleware/CheckPermission.php (1)

1-24: Middleware implementado corretamente para verificação de permissões.

O middleware CheckPermission está bem estruturado e segue as convenções do Laravel. A lógica para verificar se um usuário possui uma permissão específica é delegada ao modelo User através do método hasPermission, o que mantém uma boa separação de responsabilidades.

database/migrations/2025_04_02_184003_create_permissions_table.php (2)

1-22: Migração para tabela de permissões implementada corretamente.

A estrutura da tabela permissions está bem definida com um ID auto-incrementável, uma coluna name única e timestamps. O método down() também está corretamente implementado para garantir rollbacks limpos.


1-1: Verifique a data no nome do arquivo de migração.

O arquivo está datado como 2025_04_02, o que parece ser uma data futura. Normalmente, os arquivos de migração são nomeados com a data atual da criação.

Verifique se esta data futura é intencional ou se deve ser ajustada para refletir a data atual.

app/Models/Permission.php (1)

1-21: Modelo Permission implementado corretamente.

O modelo está bem estruturado com a propriedade $fillable e o relacionamento many-to-many com o modelo Role.

app/Models/User.php (1)

31-31: Revise a presença de 'permission' em $fillable.

Considerando que agora você está implementando um sistema baseado em roles e permissions usando relacionamentos, o campo permission no array $fillable pode ser obsoleto ou inconsistente com o novo design.

database/seeders/DatabaseSeeder.php (2)

8-8: Importação correta.

A importação da classe PermissionsSeeder está correta.


28-28: Seed de permissões está correto.

A chamada ao PermissionsSeeder está implementada corretamente.

database/migrations/2025_03_16_150203_create_permission_table.php (2)

14-14: Tabela nomeada corretamente.

O uso do nome plural 'permissions' para a tabela está de acordo com as convenções do Laravel.


38-38: Drop da tabela está consistente.

O método down() está corretamente utilizando o mesmo nome de tabela ('permissions') que foi criado no método up().

app/Models/Role.php (2)

14-16: Boa adição do atributo fillable.

A adição de protected $fillable = ['name'] permite a atribuição em massa para o atributo 'name', o que é uma prática comum em Laravel para controlar quais campos podem ser preenchidos usando métodos como create() ou update().


25-26: Aprimoramento na definição do relacionamento many-to-many.

A especificação explícita do nome da tabela pivot (role_permission) e dos nomes de chaves estrangeiras (role_id e permission_id) no método belongsToMany melhora a clareza e evita possíveis conflitos de naming conventions.

app/Http/Kernel.php (1)

31-34: Registro adequado dos middlewares de role e permissão.

Os middlewares role e checkPermission estão corretamente registrados no array $routeMiddleware, permitindo que sejam facilmente aplicados às rotas.

routes/api.php (6)

28-29: Importação correta dos novos controladores.

As importações dos novos controladores AdminDashboardController e ReportController estão corretas e seguem as convenções de namespace do Laravel.


56-59: Rota administrativa com middleware de verificação de função.

A nova rota /admin está protegida pelo middleware 'role:admin', o que é adequado para garantir que apenas usuários com a função de administrador possam acessar este endpoint.


67-71: Implementação correta de verificação de permissão específica.

A rota de relatórios está corretamente protegida pelo middleware 'checkPermission:view_reports', usando uma permissão específica que descreve claramente a ação permitida.


73-85: Não há alterações significativas na estrutura das rotas de usuário.

As rotas de usuário foram apenas reindentadas e movidas para depois das novas rotas administrativas e de relatórios, sem alterações na funcionalidade.


109-109: Correção de sintaxe na definição da rota.

Pequena alteração na sintaxe da definição da rota '/squad/{uuid}', sem mudanças na funcionalidade.


61-65:

Details

❓ Verification inconclusive

Verifique a coerência entre middleware e controller.

A rota /admin/dashboard está protegida pelo middleware 'checkPermission:admin', mas seria mais coerente usar 'role:admin' ou definir uma permissão específica como 'view_dashboard'.

Verifique se existe uma permissão chamada 'admin' ou se a intenção era verificar o papel do usuário. Se for verificar permissão, recomendamos criar uma permissão específica como 'view_dashboard'.


🏁 Script executed:

#!/bin/bash
# Verificar se existe uma permissão chamada 'admin' no código
echo "Procurando por permissões com nome 'admin':"
rg -i "permission.*admin" --type php

echo "Procurando seeders de permissão que possam definir 'admin':"
rg -i "admin.*permission" --type php

Length of output: 582


Atenção: Verificação da coerência entre middleware e verificação de permissão

A análise evidencia que a string "admin" está sendo utilizada para a verificação de permissão em outros trechos do código (como nos controllers PermissionUserController.php e ActiveProductController.php). Assim, se a intenção foi realizar uma checagem de permissão para restringir o acesso à rota /admin/dashboard, a utilização do middleware checkPermission:admin está consistente.

No entanto, caso o objetivo seja validar o papel (role) do usuário, seria mais adequado:

  • Ajustar o middleware para role:admin
  • OU definir uma permissão mais específica para o dashboard, como view_dashboard, se a verificação for de permissão

Recomendo uma verificação manual para confirmar se a estratégia adotada (teste de permissão versus teste de papel) está alinhada com a arquitetura de segurança definida para o projeto.

Comment on lines +12 to +16
DB::table('permission')->insert([
['name' => 'Criar'],
['name' => 'Editar'],
['name' => 'Deletar'],
]);

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue

Corrigir nome da tabela no seeder.

Há uma inconsistência no nome da tabela. A migração cria uma tabela chamada permissions (plural), mas o seeder está tentando inserir registros em uma tabela chamada permission (singular).

- DB::table('permission')->insert([
+ DB::table('permissions')->insert([
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
DB::table('permission')->insert([
['name' => 'Criar'],
['name' => 'Editar'],
['name' => 'Deletar'],
]);
DB::table('permissions')->insert([
['name' => 'Criar'],
['name' => 'Editar'],
['name' => 'Deletar'],
]);

Comment thread app/Models/Permission.php
Comment on lines +18 to +19
return $this->belongsToMany(Role::class, "role_permissions", "permission_id",
"role_id");

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

💡 Verification agent

🧩 Analysis chain

Verificar inconsistência no nome da tabela pivot.

Há uma possível inconsistência no nome da tabela pivot. Aqui você está usando "role_permissions" (plural), mas no modelo Role (conforme o snippet fornecido) está sendo usado "role_permission" (singular).

- return $this->belongsToMany(Role::class, "role_permissions", "permission_id",
+ return $this->belongsToMany(Role::class, "role_permission", "permission_id",

Alternativamente, você pode atualizar o relacionamento no modelo Role para usar o mesmo nome de tabela.

Verifique qual nome de tabela é o correto e garanta que ambos os modelos estejam usando o mesmo nome para a tabela pivot.


Ajuste Necessário: Consistência no Nome da Tabela Pivot

Conforme apontado, há uma inconsistência entre os nomes da tabela pivot utilizados nos modelos. No modelo Permission está sendo usado "role_permissions" (plural), enquanto que o modelo Role está referenciando "role_permission" (singular). É necessário alinhar ambos para que utilizem o mesmo nome.

  • Arquivo: app/Models/Permission.php (linhas 18-19)
  • Ação Sugerida: Altere o relacionamento para utilizar o nome consistente, por exemplo:
    - return $this->belongsToMany(Role::class, "role_permissions", "permission_id", "role_id");
    + return $this->belongsToMany(Role::class, "role_permission", "permission_id", "role_id");

🏁 Script executed:

#!/bin/bash
echo "Verificando a consistência dos nomes das tabelas pivot nos modelos Permission e Role..."

# Verificar a declaração no model Permission (app/Models/Permission.php)
echo "Pesquisando em app/Models/Permission.php:"
rg -n 'belongsToMany.*role_permissions' app/Models/Permission.php

# Verificar a declaração no model Role (app/Models/Role.php)
echo "Pesquisando em app/Models/Role.php:"
rg -n 'belongsToMany' app/Models/Role.php | grep -E 'role_permission|role_permissions'

Length of output: 812


Alinhar nomenclatura da tabela pivot

Observamos que no modelo Permission (linhas 18-19) o relacionamento utiliza "role_permissions" (plural), enquanto no modelo Role (linha 25) é usado "role_permission" (singular). É necessário alinhar ambos para garantir a consistência do relacionamento.

  • Arquivo: app/Models/Permission.php (linhas 18-19)
  • Arquivo: app/Models/Role.php (linha 25)
  • Sugestão: Atualizar um dos modelos para que ambos utilizem o mesmo nome. Por exemplo, se o nome correto for o singular, altere o modelo Permission conforme o diff abaixo:
- return $this->belongsToMany(Role::class, "role_permissions", "permission_id", "role_id");
+ return $this->belongsToMany(Role::class, "role_permission", "permission_id", "role_id");

Certifique-se de que a definição da tabela pivot esteja correta e consistente em ambos os modelos.

📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
return $this->belongsToMany(Role::class, "role_permissions", "permission_id",
"role_id");
return $this->belongsToMany(Role::class, "role_permission", "permission_id", "role_id");

$table->uuid('uuid')->unique();
$table->string('name', 60);
$table->string('email', 60)->unique();
$table->string('email_verified_at', 60)->unique();

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Atenção ao tipo de coluna email_verified_at

A coluna email_verified_at está definida como string com restrição única, mas em projetos Laravel convencionalmente esta coluna é do tipo timestamp e pode ser nula. A definição atual pode causar problemas:

  1. A restrição unique() impedirá que múltiplos usuários verifiquem seus emails no mesmo momento
  2. Sem a restrição nullable(), todos os usuários precisarão ter esta coluna preenchida desde a criação

Recomendo alterar a definição para seguir o padrão Laravel:

-$table->string('email_verified_at', 60)->unique();
+$table->timestamp('email_verified_at')->nullable();
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
$table->string('email_verified_at', 60)->unique();
$table->timestamp('email_verified_at')->nullable();

@@ -0,0 +1,14 @@
<?php

namespace App\Http\Controllers\Report;

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Inconsistência entre namespace e localização do arquivo

O namespace App\Http\Controllers\Report indica que este arquivo deveria estar em um subdiretório Report, mas o caminho do arquivo é app/Http/Controllers/ReportController.php.

Recomendo uma das seguintes opções:

  1. Mover o arquivo para app/Http/Controllers/Report/ReportController.php
  2. Ou alterar o namespace para App\Http\Controllers

Comment on lines +10 to +13
public function index()
{
return response()->json(['message' => 'Relatórios disponíveis.']);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Implementação mínima do controlador de relatórios

O método index apenas retorna uma mensagem estática sem funcionalidade real de relatórios.

Recomendo expandir a implementação para fornecer dados reais de relatórios e adicionar verificação de permissões conforme mencionado nos objetivos do PR. Considere:

  1. Adicionar verificação de permissões usando o middleware mencionado no PR
  2. Implementar métodos para recuperar dados reais de relatórios
  3. Estruturar a resposta de acordo com padrões de API (como JSON:API)

Exemplo de implementação melhorada:

public function index()
{
    // Aqui viria a lógica para buscar relatórios do banco de dados
    $reports = []; // Substitua por dados reais
    
    return response()->json([
        'status' => 'success',
        'data' => $reports,
        'message' => 'Relatórios disponíveis.'
    ]);
}

Comment on lines +21 to +25
$user = Auth::user();

if ($user && $user->roles->contains('name', $role)) {
return $next($request);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue

Inconsistência no relacionamento de roles.

No modelo User, a relação definida é role() (singular), indicando que um usuário pertence a um único role. No entanto, aqui está sendo usado roles (plural) com o método contains, sugerindo uma relação muitos-para-muitos.

$user = Auth::user();

- if ($user && $user->roles->contains('name', $role)) {
+ if ($user && $user->role && $user->role->name === $role) {
    return $next($request);
}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
$user = Auth::user();
if ($user && $user->roles->contains('name', $role)) {
return $next($request);
}
$user = Auth::user();
if ($user && $user->role && $user->role->name === $role) {
return $next($request);
}

return $next($request);
}

abort(403, 'Acesso negado');

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Considere usar response JSON em vez de abort.

Como esta é uma API, seria mais apropriado retornar uma resposta JSON com código de status 403 em vez de usar a função abort(), para manter a consistência com o restante da API.

- abort(403, 'Acesso negado');
+ return response()->json(['message' => 'Acesso negado'], 403);
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
abort(403, 'Acesso negado');
return response()->json(['message' => 'Acesso negado'], 403);

Comment on lines +20 to +30
// Inserir permissões iniciais
$permissions = [
['name' => 'cadastrar_produto'],
['name' => 'consultar_produto'],
['name' => 'editar_produto'],
['name' => 'deletar_produto']
];

foreach ($permissions as $permission) {
DB::table('permissions')->insert($permission);
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue

Falta importação da facade DB e inconsistência nos nomes das permissões.

Há duas questões neste trecho:

  1. A facade DB é utilizada, mas não foi importada
  2. Os nomes das permissões diferem das mencionadas no PermissionsSeeder ('Criar', 'Editar', 'Deletar')
+ use Illuminate\Support\Facades\DB;

// Inserir permissões iniciais
$permissions = [
-   ['name' => 'cadastrar_produto'],
-   ['name' => 'consultar_produto'],
-   ['name' => 'editar_produto'],
-   ['name' => 'deletar_produto']
+   ['name' => 'Criar'],
+   ['name' => 'Editar'],
+   ['name' => 'Deletar']
];

foreach ($permissions as $permission) {
    DB::table('permissions')->insert($permission);
}
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
// Inserir permissões iniciais
$permissions = [
['name' => 'cadastrar_produto'],
['name' => 'consultar_produto'],
['name' => 'editar_produto'],
['name' => 'deletar_produto']
];
foreach ($permissions as $permission) {
DB::table('permissions')->insert($permission);
}
+ use Illuminate\Support\Facades\DB;
// Inserir permissões iniciais
$permissions = [
['name' => 'Criar'],
['name' => 'Editar'],
['name' => 'Deletar']
];
foreach ($permissions as $permission) {
DB::table('permissions')->insert($permission);
}

Comment thread app/Http/Kernel.php
Comment on lines +9 to +14
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\CheckRole::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

⚠️ Potential issue

CheckRole configurado como middleware global - revise esta configuração.

O middleware CheckRole está configurado como global, o que significa que será executado em todas as requisições HTTP, incluindo rotas públicas. Isso pode causar problemas de autenticação em rotas que deveriam ser acessíveis sem login.

Considere remover o CheckRole do array de middleware global e aplicá-lo apenas nas rotas que realmente necessitam de verificação de função:

protected $middleware = [
    \Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
    \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
-   \App\Http\Middleware\CheckRole::class,
    \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\App\Http\Middleware\CheckRole::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];
protected $middleware = [
\Illuminate\Foundation\Http\Middleware\CheckForMaintenanceMode::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
];

Comment thread app/Http/Kernel.php
Comment on lines +16 to +29
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\CheckRole::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];

Copy link
Copy Markdown

Choose a reason for hiding this comment

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

🛠️ Refactor suggestion

Redundância na configuração de middleware do grupo 'web'.

O middleware CheckRole está configurado tanto globalmente quanto no grupo 'web', o que é redundante. Além disso, os middlewares ValidatePostSize e ConvertEmptyStringsToNull também estão duplicados.

Remova as duplicações e considere adicionar outros middlewares importantes que estão faltando no grupo 'web':

protected $middlewareGroups = [
    'web' => [
-       \App\Http\Middleware\CheckRole::class,
-       \Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
-       \Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
        \Illuminate\Session\Middleware\StartSession::class,
        \Illuminate\View\Middleware\ShareErrorsFromSession::class,
+       \Illuminate\Cookie\Middleware\EncryptCookies::class,
+       \Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
+       \App\Http\Middleware\VerifyCsrfToken::class,
        \Illuminate\Routing\Middleware\SubstituteBindings::class,
    ],
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
protected $middlewareGroups = [
'web' => [
\App\Http\Middleware\CheckRole::class,
\Illuminate\Foundation\Http\Middleware\ValidatePostSize::class,
\Illuminate\Foundation\Http\Middleware\ConvertEmptyStringsToNull::class,
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];
protected $middlewareGroups = [
'web' => [
\Illuminate\Session\Middleware\StartSession::class,
\Illuminate\View\Middleware\ShareErrorsFromSession::class,
\Illuminate\Cookie\Middleware\EncryptCookies::class,
\Illuminate\Cookie\Middleware\AddQueuedCookiesToResponse::class,
\App\Http\Middleware\VerifyCsrfToken::class,
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
'api' => [
'throttle:60,1',
\Illuminate\Routing\Middleware\SubstituteBindings::class,
],
];

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.

2 participants