-
Notifications
You must be signed in to change notification settings - Fork 0
Developer #12
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
Developer #12
Changes from all commits
89a92db
842de21
2d3cbab
939b847
2057d91
5f11d6e
e5d7280
17fda3b
5f215ef
efe357b
a50475f
183d3af
56864d4
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
Large diffs are not rendered by default.
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -1,10 +1,48 @@ | ||
| include: package:flutter_lints/flutter.yaml | ||
|
|
||
| code_style: | ||
| line-length: 120 | ||
|
|
||
| linter: | ||
| rules: | ||
| prefer_const_constructors: true | ||
| prefer_final_locals: true | ||
| always_declare_return_types: true | ||
| annotate_overrides: true | ||
| avoid_print: true # Use logger ou debugPrint | ||
|
|
||
| avoid_print: true # Evita o uso de print, que pode ser útil para depuração, mas deve ser removido em produção. | ||
| prefer_single_quotes: true # Usa aspas simples em strings para manter a consistência. | ||
| prefer_const_constructors: true # Encoraja o uso de construtores constantes quando possível para otimização. | ||
| prefer_final_fields: true # Use final para campos que não são reatribuídos, garantindo imutabilidade. | ||
| prefer_is_not_empty: true # Incentiva o uso de isNotEmpty em vez de !isEmpty para clareza. | ||
| always_use_package_imports: true # Garante que todos os imports sejam feitos com package: para evitar conflitos de nome. | ||
| avoid_empty_else: true # Evita blocos else vazios que podem confundir a leitura do código. | ||
| avoid_unnecessary_containers: true # Evita o uso desnecessário de Container quando outro widget pode ser mais apropriado. | ||
| avoid_redundant_argument_values: false # Evita passar valores padrão redundantes para parâmetros. | ||
| prefer_const_literals_to_create_immutables: true # Incentiva o uso de literais const para listas e mapas imutáveis. | ||
| prefer_final_locals: true # Use final para variáveis locais que não são reatribuídas, melhorando a legibilidade. | ||
| file_names: true # Garante que os nomes de arquivos sigam as convenções de nomenclatura. | ||
| unnecessary_new: true # Remove a palavra-chave 'new', que é desnecessária nas versões mais recentes do Dart. | ||
| prefer_adjacent_string_concatenation: true # Incentiva a concatenação de strings adjacentes em uma única operação. | ||
| prefer_inlined_adds: true # Incentiva o uso de adição em linha em vez de métodos separados, quando possível. | ||
| unnecessary_this: true # Remove o uso desnecessário do 'this', que pode ser redundante em alguns contextos. | ||
| avoid_return_types_on_setters: true # Evita o uso de tipos de retorno em setters, que devem ser void. | ||
| prefer_final_parameters: true # Use final para parâmetros que não são reatribuídos, promovendo a imutabilidade. | ||
| omit_local_variable_types: true # Incentiva a omissão de tipos de variáveis locais para permitir a inferência de tipo. | ||
| always_declare_return_types: true # Sempre declare tipos de retorno em funções para melhor legibilidade. | ||
| prefer_typing_uninitialized_variables: true # Exige que variáveis não inicializadas sejam tipadas. | ||
| avoid_dynamic_calls: true # Desencoraja o uso de chamadas dinâmicas, que podem introduzir erros. | ||
| use_key_in_widget_constructors: true # Incentiva o uso de chaves nos construtores de widgets para otimização de desempenho. | ||
| prefer_const_constructors_in_immutables: true # Incentiva construtores constantes em classes imutáveis. | ||
| always_put_required_named_parameters_first: true # Garante que os parâmetros nomeados obrigatórios venham primeiro. | ||
| sort_pub_dependencies: true # Ordena as dependências no pubspec.yaml para melhor organização. | ||
| unnecessary_const: true # Remove a palavra-chave 'const' onde não é necessária para simplificação do código. | ||
| use_setters_to_change_properties: true # Incentiva o uso de setters para modificar propriedades de objetos. | ||
| type_annotate_public_apis: true # Exige anotação de tipo para APIs públicas para maior clareza. | ||
| prefer_asserts_with_message: true # Incentiva o uso de mensagens em assertivas para facilitar a depuração. | ||
| prefer_spread_collections: true # Incentiva o uso de spread em coleções para simplificar a sintaxe. | ||
| prefer_mixin: true # Incentiva o uso de mixins em vez de herança para reutilização de código. | ||
| avoid_void_async: true # Desencoraja o uso de funções assíncronas que retornam void. | ||
| prefer_collection_literals: true # Incentiva o uso de literais de coleção em vez de construtores de coleção. | ||
| prefer_is_empty: true # Usa isEmpty em vez de verificar se o comprimento é 0, promovendo a legibilidade. | ||
| avoid_escaping_inner_quotes: true # Desencoraja a fuga de aspas internas em strings, que pode tornar o código confuso. | ||
| no_leading_underscores_for_local_identifiers: false # Proíbe sublinhados iniciais para identificadores locais, melhorando a clareza. | ||
| prefer_null_aware_operators: true # Incentiva o uso de operadores nulos para simplificar verificações nulas. | ||
| avoid_positional_boolean_parameters: true # Desencoraja o uso de parâmetros booleanos posicionais, que podem ser confusos. | ||
| avoid_implementing_value_types: true # Evita a implementação de tipos de valor, que pode causar problemas de desempenho. | ||
| prefer_int_literals: true # Incentiva o uso de literais int para números inteiros para maior clareza. |
| Original file line number | Diff line number | Diff line change | ||||||||||||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
|
@@ -28,6 +28,7 @@ create table skills ( | |||||||||||||||||||||
| name text not null, | ||||||||||||||||||||||
| type text not null, -- Vamos usar: 'mobile', 'web' ou 'tools' | ||||||||||||||||||||||
| is_highlight boolean default false, -- Se é destaque (true/false) | ||||||||||||||||||||||
| icon_asset text, -- Caminho do ícone (opcional) | ||||||||||||||||||||||
| created_at timestamp with time zone default timezone('utc'::text, now()) not null | ||||||||||||||||||||||
| ); | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
|
|
@@ -43,8 +44,6 @@ create policy "Qualquer um pode ler experiencias" on experiences for select usin | |||||||||||||||||||||
| alter table skills enable row level security; | ||||||||||||||||||||||
| create policy "Qualquer um pode ler skills" on skills for select using (true); | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| ALTER TABLE skills ADD COLUMN icon_url text; | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| alter table certificates enable row level security; | ||||||||||||||||||||||
| create policy "Public Access" on certificates for select using (true); | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
|
|
@@ -69,4 +68,41 @@ create policy "Admin Delete Skills" on skills for delete to authenticated using | |||||||||||||||||||||
| -- Tabela CERTIFICATES | ||||||||||||||||||||||
| create policy "Admin Insert Certs" on certificates for insert to authenticated with check (true); | ||||||||||||||||||||||
| create policy "Admin Update Certs" on certificates for update to authenticated using (true); | ||||||||||||||||||||||
| create policy "Admin Delete Certs" on certificates for delete to authenticated using (true); | ||||||||||||||||||||||
| create policy "Admin Delete Certs" on certificates for delete to authenticated using (true); | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
|
|
||||||||||||||||||||||
| create table app_logs ( | ||||||||||||||||||||||
| id bigserial primary key, | ||||||||||||||||||||||
| level text, -- info, debug, error, warning | ||||||||||||||||||||||
| message text, | ||||||||||||||||||||||
| stack text, | ||||||||||||||||||||||
| timestamp timestamptz default now(), | ||||||||||||||||||||||
| user_id uuid -- opcional, se tiver login | ||||||||||||||||||||||
| ); | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| -- Habilitar RLS | ||||||||||||||||||||||
| alter table app_logs enable row level security; | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| -- Permitir inserção de logs (autenticados ou anônimos) | ||||||||||||||||||||||
| create policy "Qualquer um pode inserir logs" | ||||||||||||||||||||||
| on app_logs | ||||||||||||||||||||||
| for insert | ||||||||||||||||||||||
| with check (true); | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| -- Permitir que o usuário selecione apenas seus próprios logs | ||||||||||||||||||||||
| create policy "Usuário pode ler seus próprios logs" | ||||||||||||||||||||||
| on app_logs | ||||||||||||||||||||||
| for select | ||||||||||||||||||||||
| using (auth.uid() = user_id); | ||||||||||||||||||||||
|
|
||||||||||||||||||||||
| -- Permitir que admins leiam todos os logs | ||||||||||||||||||||||
| create policy "Admin pode ler todos os logs" | ||||||||||||||||||||||
| on app_logs | ||||||||||||||||||||||
| for select | ||||||||||||||||||||||
| using (auth.uid() IN ( | ||||||||||||||||||||||
| -- Adicione aqui os UUIDs dos usuários admin | ||||||||||||||||||||||
| -- Exemplo: 'uuid-do-admin-1', 'uuid-do-admin-2' | ||||||||||||||||||||||
| select id from auth.users where email = 'seu-email-admin@exemplo.com' | ||||||||||||||||||||||
| )); | ||||||||||||||||||||||
|
Comment on lines
+102
to
+106
|
||||||||||||||||||||||
| using (auth.uid() IN ( | |
| -- Adicione aqui os UUIDs dos usuários admin | |
| -- Exemplo: 'uuid-do-admin-1', 'uuid-do-admin-2' | |
| select id from auth.users where email = 'seu-email-admin@exemplo.com' | |
| )); | |
| using ( | |
| -- ATENÇÃO: Substitua os valores abaixo pelos UUIDs dos usuários admin antes de implantar em produção. | |
| -- Você pode obter os UUIDs dos admins na tabela auth.users. | |
| auth.uid() IN ('uuid-do-admin-1', 'uuid-do-admin-2') | |
| ) |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,46 @@ | ||
| // Package imports: | ||
| import 'package:supabase_flutter/supabase_flutter.dart'; | ||
|
|
||
| final supabase = Supabase.instance.client; | ||
|
|
||
| class AppLogger { | ||
| static Future<void> log({ | ||
| required final String level, | ||
| required final String message, | ||
| final String? stack, | ||
| final String? userId, | ||
| }) async { | ||
| try { | ||
| // Se não passar userId, tenta pegar o usuário autenticado | ||
| final currentUserId = userId ?? supabase.auth.currentUser?.id; | ||
|
|
||
| await supabase.from('app_logs').insert({ | ||
| 'level': level, | ||
| 'message': message, | ||
| 'stack': stack, | ||
| 'user_id': currentUserId, | ||
| }); | ||
| } catch (e) { | ||
| // evita que falha no logging quebre o app | ||
| // Use apenas print em dev, em produção considere remover ou usar serviço externo | ||
| print('⚠️ Erro ao gravar log no Supabase: $e'); | ||
|
||
| } | ||
| } | ||
|
Comment on lines
+7
to
+28
|
||
|
|
||
| // Métodos auxiliares para facilitar o uso | ||
| static Future<void> info(final String message, {final String? stack}) async { | ||
| await log(level: 'info', message: message, stack: stack); | ||
| } | ||
|
|
||
| static Future<void> debug(final String message, {final String? stack}) async { | ||
| await log(level: 'debug', message: message, stack: stack); | ||
| } | ||
|
|
||
| static Future<void> error(final String message, {final String? stack}) async { | ||
| await log(level: 'error', message: message, stack: stack); | ||
| } | ||
|
|
||
| static Future<void> warning(final String message, {final String? stack}) async { | ||
| await log(level: 'warning', message: message, stack: stack); | ||
| } | ||
| } | ||
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
The RLS policy allows anyone (authenticated or anonymous) to insert logs with "with check (true)". While this supports the logging functionality for unauthenticated users, it could be exploited to flood the database with excessive log entries. Consider adding rate limiting at the application level or implementing a more restrictive policy that limits the number of log entries per IP/session.