diff --git a/.gitignore b/.gitignore
index 6fc99faa39..06946f0dde 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,6 +1,12 @@
## Ignore Visual Studio temporary files, build results, and
## files generated by popular Visual Studio add-ons.
+#mock-api-runtime
+*.jar
+
+#sonar
+.scannerwork
+
# User-specific files
*.suo
*.user
diff --git a/SME.SGP.Api.Teste/Controllers/PermissionamentoControllerTeste.cs b/SME.SGP.Api.Teste/Controllers/PermissionamentoControllerTeste.cs
index bc14c9364e..e2531a5209 100644
--- a/SME.SGP.Api.Teste/Controllers/PermissionamentoControllerTeste.cs
+++ b/SME.SGP.Api.Teste/Controllers/PermissionamentoControllerTeste.cs
@@ -6,6 +6,8 @@
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
+using Microsoft.AspNetCore.Authorization;
+using SME.SGP.Api.Controllers;
using Xunit;
namespace SME.SGP.Api.Teste.Controllers
@@ -27,8 +29,11 @@ public async Task Verificar_Se_Existe_Permissao_Ou_AllowAnonymou_Authorize_Contr
ObterDadosControllers(listaApiMethod, apiControllers, AssemblyName);
- var listMetodos = listaApiMethod.Where(x => x.CustomAttributeName.Count == 0);
- var semAuthorizeAttribute = listaApiMethod.Where(x => x.Authorize ==false);
+
+ //o ideal seria olhar pelo atributo [AllowAnonymous] para criterio de exclusao
+ var exclusions = new []{nameof(VersaoController)};
+ var listMetodos = listaApiMethod.Where(x => x.CustomAttributeName.Count == 0 && !exclusions.Contains(x.ControllerName));
+ var semAuthorizeAttribute = listaApiMethod.Where(x => x.Authorize ==false && !exclusions.Contains(x.ControllerName));
var listAutorizecontrollerName = semAuthorizeAttribute.GroupBy(x => x.ControllerName).ToList();
var listcontrollerName = listMetodos.GroupBy(c => c.ControllerName).ToList();
@@ -44,8 +49,10 @@ public async Task Verificar_Se_Existe_Permissao_Ou_AllowAnonymou_Authorize_Contr
ObterDadosControllers(listaApiMethod, apiControllers, AssemblyName);
- var listMetodos = listaApiMethod.Where(x => x.CustomAttributeName.Count == 0);
- var semAuthorizeAttribute = listaApiMethod.Where(x => x.Authorize == false);
+ //o ideal seria olhar pelo atributo [AllowAnonymous] para criterio de exclusao
+ var exclusions = new []{nameof(VersaoController)};
+ var listMetodos = listaApiMethod.Where(x => x.CustomAttributeName.Count == 0 && !exclusions.Contains(x.ControllerName));
+ var semAuthorizeAttribute = listaApiMethod.Where(x => x.Authorize == false && !exclusions.Contains(x.ControllerName));
var listAutorizecontrollerName = semAuthorizeAttribute.GroupBy(x => x.ControllerName).ToList();
var listcontrollerName = listMetodos.GroupBy(c => c.ControllerName).ToList();
diff --git a/SME.SGP.Api.Teste/SME.SGP.Api.Teste.csproj b/SME.SGP.Api.Teste/SME.SGP.Api.Teste.csproj
index 044175053e..b9b2fb4389 100644
--- a/SME.SGP.Api.Teste/SME.SGP.Api.Teste.csproj
+++ b/SME.SGP.Api.Teste/SME.SGP.Api.Teste.csproj
@@ -2,7 +2,7 @@
net5.0
-
+ true
false
bf27baf5-fe9e-4489-8f4e-5234401470bd
diff --git a/docker-compose-dev.yaml b/docker-compose-dev.yaml
new file mode 100644
index 0000000000..07c62984b8
--- /dev/null
+++ b/docker-compose-dev.yaml
@@ -0,0 +1,61 @@
+version: "3.1"
+services:
+ sme-db:
+ container_name: sme-db
+ restart: always
+ image: postgres:11-alpine
+ ports:
+ - "5433:5432"
+ environment:
+ POSTGRES_PASSWORD: postgres
+ POSTGRES_DB: sgp_db
+ deploy:
+ resources:
+ limits:
+ cpus: "4"
+ memory: 10g
+ reservations:
+ cpus: "4"
+ memory: 10g
+ networks:
+ - sme-network
+ sme-flyway:
+ container_name: sme-flyway
+ restart: on-failure
+ image: boxfuse/flyway:5.2.4
+ command: migrate -locations='filesystem:/opt/scripts' -url='jdbc:postgresql://sme-db:5432/sgp_db?user=postgres&password=postgres' -outOfOrder=true
+ volumes:
+ - ./scripts:/opt/scripts
+ depends_on:
+ - sme-db
+ networks:
+ - sme-network
+ sme-rabbitmq:
+ container_name: sme-rabbitmq
+ image: rabbitmq:3.10.6-management-alpine
+ environment:
+ - RABBITMQ_DEFAULT_USER=rabbitmq
+ - RABBITMQ_DEFAULT_PASS=rabbitmq
+ deploy:
+ resources:
+ limits:
+ cpus: "4"
+ memory: 10g
+ reservations:
+ cpus: "4"
+ memory: 10g
+ ports:
+ - "5673:5672"
+ - "15673:15672"
+ networks:
+ - sme-network
+networks:
+ sme-network:
+ driver: bridge
+
+# insert into ue (nome,data_atualizacao) values ('ue1',now());
+# insert into tipo_calendario (nome,ano_letivo,periodo,modalidade,criado_em,criado_por,criado_rf) values ('Calendario 1',2022,1,1,now(),1,1);
+# insert into aula (ue_id,disciplina_id,turma_id,tipo_calendario_id,professor_rf,quantidade,data_aula,recorrencia_aula,tipo_aula,criado_em,criado_por,criado_rf)
+# values (1,1,1,1,'prof1',1,now(),'1','1',now(),now(),'admin');
+# insert into diario_bordo (aula_id,planejamento,criado_em,criado_por,criado_rf) values (1,'sd',now(),1,1);
+# insert into diario_bordo_observacao (diario_bordo_id,observacao,criado_em,criado_por,criado_rf,usuario_id) values (1,'sd',now(),1,1,1);
diff --git a/mocks/apm.yaml b/mocks/apm.yaml
new file mode 100644
index 0000000000..193550069c
--- /dev/null
+++ b/mocks/apm.yaml
@@ -0,0 +1,8 @@
+- method: POST
+ path: /apm/intake/v2/events
+ features:
+ delay: 0
+ response:
+ status: 200
+ body:
+ message: "ok"
\ No newline at end of file
diff --git a/mocks/eol.yaml b/mocks/eol.yaml
new file mode 100644
index 0000000000..c65da81477
--- /dev/null
+++ b/mocks/eol.yaml
@@ -0,0 +1,546 @@
+- method: GET
+ path: /eol/swagger/index.html
+ features:
+ delay: 0
+ response:
+ status: 200
+ body:
+ Message: "ok"
+- method: POST
+ path: /eol/v1/autenticacao
+ features:
+ delay: 0
+ response:
+ status: 200
+ body:
+ CodigoRf: "1"
+ Status: Ok
+ UsuarioId: a7f525b9-0e3c-4546-8457-08f697cfc6f6
+- method: GET
+ path: /eol/autenticacaoSgp/CarregarPerfisPorLogin/{login}
+ features:
+ delay: 0
+ response:
+ status: 200
+ body:
+ CodigoRf: ${login}
+ PossuiCargoCJ: true
+ Perfis:
+ - 46E1E074-37D6-E911-ABD6-F81654FE895D
+ PossuiPerfilCJ: true
+ ContratoExterno: false
+- method: GET
+ path: /eol/AutenticacaoSgp/{login}/dados
+ features:
+ delay: 0
+ response:
+ status: 200
+ body:
+ Nome: SomeUser
+ Cpf: 000.000.000-00
+ CodigoRf: ${login}
+ Empresa: SomeCompany
+ Email: ${login}@sme.com
+- method: GET
+ path: /eol/abrangencia/compacta-vigente/{login}/perfil/{perfil}
+ features:
+ delay: 0
+ response:
+ status: 200
+ body:
+ Login: ${login}
+ Abrangencia:
+ Abrangencia: SME
+ CargosId:
+ - 1
+ CdTipoFuncaoAtividade: 1
+ Grupo: ADMSME
+ GrupoID: ${perfil}
+ IdDres: []
+ IdUes: []
+ IdTurmas: []
+- method: GET
+ path: /eol/v1/componentes-curriculares/turmas/{turma}/funcionarios/{login}/perfis/{perfil}/agrupaComponenteCurricular/{realizarAgrupamento}
+ features:
+ delay: 0
+ response:
+ status: 200
+ body:
+ - Codigo: 1
+ CodigoComponenteCurricularPai: 1
+ RegistraFrequencia: true
+ LancaNota: true
+ GrupoMatriz:
+ Id: 1
+- method: GET
+ path: /eol/Turmas/{turma}/alunos-ativos/data-aula-ticks/{data-aula}
+ features:
+ delay: 0
+ response:
+ status: 200
+ body:
+ - nomeAluno: "Aluno 1"
+ CodigoAluno: 1
+ NumeroAlunoChamada: 1
+ Ano: 1
+ CodigoSituacaoMatricula: 1
+ SituacaoMatricula: Ativo
+ CodigoTurma: 1
+ DataSituacao: "2023-01-01T00:00:00"
+ DataMatricula: "2023-01-01T00:00:00"
+- method: GET
+ path: /eol/alunos/{codigoAluno}/turmas/anosLetivos/{anoLetivo}/historico/{consideraHistorico}/filtrar-situacao/{filtrarSituacao}
+ features:
+ delay: 0
+ response:
+ status: 200
+ body:
+ - nomeAluno: "Aluno 1"
+ CodigoAluno: 1
+ NumeroAlunoChamada: 1
+ Ano: 1
+ CodigoSituacaoMatricula: 1
+ SituacaoMatricula: Ativo
+ CodigoTurma: 1
+ DataSituacao: "2023-01-01T00:00:00"
+ DataMatricula: "2023-01-01T00:00:00"
+- method: GET
+ path: /eol/turmas/{codigoTurma}/dados
+ features:
+ delay: 0
+ response:
+ status: 200
+ body:
+ Ano: 1
+ AnoLetivo: 2023
+ Codigo: 1
+ TipoTurma: Regular
+ Modalidade: Fundamental
+ CodigoModalidade: 1
+ NomeTurma: "Turma 1"
+ Semestre: 0
+- method: GET
+ path: /eol/turmas/{codigoTurma}/todos-alunos
+ features:
+ delay: 0
+ response:
+ status: 200
+ body:
+ - nomeAluno: "Aluno 1"
+ CodigoAluno: 1
+ NumeroAlunoChamada: 1
+ Ano: 1
+ CodigoSituacaoMatricula: 1
+ SituacaoMatricula: Ativo
+ CodigoTurma: 1
+ DataSituacao: "2023-01-01T00:00:00"
+ DataMatricula: "2023-01-01T00:00:00"
+- method: GET
+ path: /eol/v1/componentes-curriculares/turmas/{codigoTurma}/funcionarios/{login}/perfis/{perfil}/planejamento
+ features:
+ delay: 0
+ response:
+ status: 200
+ body:
+ - Codigo: 1
+ CodigoComponenteCurricularPai: 1
+ RegistraFrequencia: true
+ LancaNota: true
+ GrupoMatriz:
+ Id: 1
+- method: GET
+ path: /eol/professores/{professorRf}/turmas/{codigoTurma}/disciplinas/{disciplinaId}/atribuicao/verificar/data
+ features:
+ delay: 0
+ response:
+ status: 200
+ body:
+ true
+- method: GET
+ path: /eol/turmas/{turmaCodigo}/considera-inativos/{consideraInativos}
+ features:
+ delay: 0
+ response:
+ status: 200
+ body:
+ - nomeAluno: "Aluno 1"
+ CodigoAluno: 1
+ NumeroAlunoChamada: 1
+ Ano: 1
+ CodigoSituacaoMatricula: 1
+ SituacaoMatricula: Ativo
+ CodigoTurma: 1
+ DataSituacao: "2023-01-01T00:00:00"
+ DataMatricula: "2023-01-01T00:00:00"
+- method: GET
+ path: /eol/turmas/ues/{ueCodigo}/modalidades/{modalidade}/anos/{anoLetivo}/componentes
+ features:
+ delay: 0
+ response:
+ status: 200
+ body:
+ TotalPaginas: 1
+ TotalRegistros: 100
+ Items:
+ - Id: 1
+ TurmaCodigo: 1
+ Modalidade: Fundamental
+ NomeTurma: "Turma 1"
+ Ano: 1
+ NomeComponenteCurricular: "Português"
+ ComponenteCurricularCodigo: 1
+ ComponenteCurricularPaiCodigo: 1
+ Turno: Manha
+- method: GET
+ path: /eol/turmas/itinerario/ensino-medio
+ features:
+ delay: 0
+ response:
+ status: 200
+ body:
+ - Id: 1
+ Nome: "Turma 1"
+ Serie: 1
+- method: GET
+ path: /eol/v1/componentes-curriculares/turmas
+ features:
+ delay: 0
+ response:
+ status: 200
+ body:
+ - Codigo: 1
+ CodigoComponenteCurricularPai: 1
+ RegistraFrequencia: true
+ LancaNota: true
+ GrupoMatriz:
+ Id : 1
+- method: GET
+ path: /api/v1/componentes-curriculares/turmas
+ features:
+ delay: 0
+ response:
+ status: 200
+ body:
+ - Codigo: 1
+ Descricao: "Português"
+ LancaNota: true
+ Regencia: false
+- method: POST
+ path: /eol/turmas/turmas-regulares
+ features:
+ delay: 0
+ response:
+ status: 200
+ body:
+ - "1"
+ - "2"
+- method: GET
+ path: /eol/AutenticacaoSgp/CarregarDadosAcesso/usuarios/{login}/perfis/{perfilGuid}
+ features:
+ delay: 0
+ response:
+ status: 200
+ body:
+ Token: "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJodHRwOi8vc2NoZW1hcy54bWxzb2FwLm9yZy93cy8yMDA1LzA1L2lkZW50aXR5L2NsYWltcy9uYW1lIjoiYWRtaW4iLCJsb2dpbiI6ImFkbWluIiwibm9tZSI6IlNvbWVVc2VyIiwicmYiOiJzb21lLnVzZXIiLCJwZXJmaWwiOiI0NkUxRTA3NC0zN0Q2LUU5MTEtQUJENi1GODE2NTRGRTg5NUQiLCJyb2xlcyI6WyIxIiwiMiIsIjMiLCI0IiwiNSIsIjYiLCI3IiwiOCIsIjkiLCIxMCIsIjExIiwiMTIiLCIxMyIsIjE0IiwiMTUiLCIxNiIsIjE3IiwiMTgiLCIxOSIsIjIwIiwiMjEiLCIyMiIsIjIzIiwiMjQiLCIyNSIsIjI2IiwiMjciLCIyOCIsIjI5IiwiMzAiLCIzMSIsIjMyIiwiMzMiLCIzNCIsIjM1IiwiMzYiLCIzNyIsIjM4IiwiMzkiLCI0MCIsIjQxIiwiNDIiLCI0MyIsIjQ0IiwiNDUiLCI0NiIsIjQ3IiwiNDgiLCI0OSIsIjUwIiwiNTEiLCI1MiIsIjUzIiwiNTQiLCI1NSIsIjU2IiwiNTciLCI1OCIsIjU5IiwiNjAiLCI2MSIsIjYyIiwiNjMiLCI2NCIsIjY1IiwiNjYiLCI2NyIsIjY4IiwiNjkiLCI3MCIsIjcxIiwiNzIiLCI3MyIsIjc0IiwiNzUiLCI3NiIsIjc3IiwiNzgiLCI3OSIsIjgwIiwiODEiLCI4MiIsIjgzIiwiODQiLCI4NSIsIjg2IiwiODciLCI4OCIsIjg5IiwiOTAiLCI5MSIsIjkyIiwiOTMiLCI5NCIsIjk1IiwiOTYiLCI5NyIsIjk4IiwiOTkiLCIxMDAiLCIxMDEiLCIxMDIiLCIxMDMiLCIxMDQiLCIxMDUiLCIxMDYiLCIxMDciLCIxMDgiLCIxMDkiLCIxMTAiLCIxMTEiLCIxMTIiLCIxMTMiLCIxMTQiLCIxMTUiLCIxMTYiLCIxMTciLCIxMTgiLCIxMTkiLCIxMjAiLCIxMjEiLCIxMjIiLCIxMjMiLCIxMjQiLCIxMjUiLCIxMjYiLCIxMjciLCIxMjgiLCIxMjkiLCIxMzAiLCIxMzEiLCIxMzIiLCIxMzMiLCIxMzQiLCIxMzUiLCIxMzYiLCIxMzciLCIxMzgiLCIxMzkiLCIxNDAiLCIxNDEiLCIxNDIiLCIxNDMiLCIxNDQiLCIxNDUiLCIxNDYiLCIxNDciLCIxNDgiLCIxNDkiLCIxNTAiLCIxNTEiLCIxNTIiLCIxNTMiLCIxNTQiLCIxNTUiLCIxNTYiLCIxNTciLCIxNTgiLCIxNTkiLCIxNjAiLCIxNjEiLCIxNjIiLCIxNjMiLCIxNjQiLCIxNjUiLCIxNjYiLCIxNjciLCIxNjgiLCIxNjkiLCIxNzAiLCIxNzEiLCIxNzIiLCIxNzMiLCIxNzQiLCIxNzUiLCIxNzYiLCIxNzciLCIxNzgiLCIxNzkiLCIxODAiLCIxODEiLCIxODIiLCIxODMiLCIxODQiLCIxODUiLCIxODYiLCIxODciLCIxODgiLCIxODkiLCIxOTAiLCIxOTEiLCIxOTIiLCIxOTMiLCIxOTQiLCIxOTUiLCIxOTYiLCIxOTciLCIxOTgiLCIxOTkiLCIyMDAiLCIyMDEiLCIyMDIiLCIyMDMiLCIyMDQiLCIyMDUiLCIyMDYiLCIyMDciLCIyMDgiLCIyMDkiLCIyMTAiLCIyMTEiLCIyMTIiLCIyMTMiLCIyMTQiLCIyMTUiLCIyMTYiLCIyMTciLCIyMTgiLCIyMTkiLCIyMjAiLCIyMjEiLCIyMjIiLCIyMjMiLCIyMjQiLCIyMjUiLCIyMjYiLCIyMjciLCIyMjgiLCIyMjkiLCIyMzAiLCIyMzEiLCIyMzIiLCIyMzMiLCIyMzQiLCIyMzUiLCIyMzYiLCIyMzciLCIyMzgiLCIyMzkiLCIyNDAiLCIyNDEiLCIyNDIiLCIyNDMiLCIyNDQiLCIyNDUiLCIyNDYiLCIyNDciLCIyNDgiLCIyNDkiLCIyNTAiLCIyNTEiLCIyNTIiLCIyNTMiLCIyNTQiLCIyNTUiLCIyNTYiLCIyNTciLCIyNTgiLCIyNTkiLCIyNjAiLCIyNjEiLCIyNjIiLCIyNjMiLCIyNjQiLCIyNjUiLCIyNjYiLCIyNjciLCIyNjgiLCIyNjkiLCIyNzAiLCIyNzEiLCIyNzIiLCIyNzMiLCIyNzQiLCIyNzUiLCIyNzYiLCIyNzciLCIyNzgiLCIyNzkiLCIyODAiLCIyODEiLCIyODIiLCIyODMiLCIyODQiLCIyODUiLCIyODYiLCIyODciLCIyODgiLCIyODkiLCIyOTAiLCIyOTEiLCIyOTIiLCIyOTMiLCIyOTQiLCIyOTUiLCIyOTYiLCIyOTciLCIyOTgiLCIyOTkiLCIzMDAiXSwibmJmIjoxNTc1NDUwODUzLCJleHAiOjE4NzU0OTQwNTMsImlzcyI6IklQVCIsImF1ZCI6IkNsaWVudEFwcCJ9.zcA2n4EjW6GmfcxqSi1ojet353Yf9A8zNMknQSYFZXQ"
+ DataExpiracaoToken: "2029-06-06T23:34:13"
+ Permissoes:
+ - 1
+ - 2
+ - 3
+ - 4
+ - 5
+ - 6
+ - 7
+ - 8
+ - 9
+ - 10
+ - 11
+ - 12
+ - 13
+ - 14
+ - 15
+ - 16
+ - 17
+ - 18
+ - 19
+ - 20
+ - 21
+ - 22
+ - 23
+ - 24
+ - 25
+ - 26
+ - 27
+ - 28
+ - 29
+ - 30
+ - 31
+ - 32
+ - 33
+ - 34
+ - 35
+ - 36
+ - 37
+ - 38
+ - 39
+ - 40
+ - 41
+ - 42
+ - 43
+ - 44
+ - 45
+ - 46
+ - 47
+ - 48
+ - 49
+ - 50
+ - 51
+ - 52
+ - 53
+ - 54
+ - 55
+ - 56
+ - 57
+ - 58
+ - 59
+ - 60
+ - 61
+ - 62
+ - 63
+ - 64
+ - 65
+ - 66
+ - 67
+ - 68
+ - 69
+ - 70
+ - 71
+ - 72
+ - 73
+ - 74
+ - 75
+ - 76
+ - 77
+ - 78
+ - 79
+ - 80
+ - 81
+ - 82
+ - 83
+ - 84
+ - 85
+ - 86
+ - 87
+ - 88
+ - 89
+ - 90
+ - 91
+ - 92
+ - 93
+ - 94
+ - 95
+ - 96
+ - 97
+ - 98
+ - 99
+ - 100
+ - 101
+ - 102
+ - 103
+ - 104
+ - 105
+ - 106
+ - 107
+ - 108
+ - 109
+ - 110
+ - 111
+ - 112
+ - 113
+ - 114
+ - 115
+ - 116
+ - 117
+ - 118
+ - 119
+ - 120
+ - 121
+ - 122
+ - 123
+ - 124
+ - 125
+ - 126
+ - 127
+ - 128
+ - 129
+ - 130
+ - 131
+ - 132
+ - 133
+ - 134
+ - 135
+ - 136
+ - 137
+ - 138
+ - 139
+ - 140
+ - 141
+ - 142
+ - 143
+ - 144
+ - 145
+ - 146
+ - 147
+ - 148
+ - 149
+ - 150
+ - 151
+ - 152
+ - 153
+ - 154
+ - 155
+ - 156
+ - 157
+ - 158
+ - 159
+ - 160
+ - 161
+ - 162
+ - 163
+ - 164
+ - 165
+ - 166
+ - 167
+ - 168
+ - 169
+ - 170
+ - 171
+ - 172
+ - 173
+ - 174
+ - 175
+ - 176
+ - 177
+ - 178
+ - 179
+ - 180
+ - 181
+ - 182
+ - 183
+ - 184
+ - 185
+ - 186
+ - 187
+ - 188
+ - 189
+ - 190
+ - 191
+ - 192
+ - 193
+ - 194
+ - 195
+ - 196
+ - 197
+ - 198
+ - 199
+ - 200
+ - 201
+ - 202
+ - 203
+ - 204
+ - 205
+ - 206
+ - 207
+ - 208
+ - 209
+ - 210
+ - 211
+ - 212
+ - 213
+ - 214
+ - 215
+ - 216
+ - 217
+ - 218
+ - 219
+ - 220
+ - 221
+ - 222
+ - 223
+ - 224
+ - 225
+ - 226
+ - 227
+ - 228
+ - 229
+ - 230
+ - 231
+ - 232
+ - 233
+ - 234
+ - 235
+ - 236
+ - 237
+ - 238
+ - 239
+ - 240
+ - 241
+ - 242
+ - 243
+ - 244
+ - 245
+ - 246
+ - 247
+ - 248
+ - 249
+ - 250
+ - 251
+ - 252
+ - 253
+ - 254
+ - 255
+ - 256
+ - 257
+ - 258
+ - 259
+ - 260
+ - 261
+ - 262
+ - 263
+ - 264
+ - 265
+ - 266
+ - 267
+ - 268
+ - 269
+ - 270
+ - 271
+ - 272
+ - 273
+ - 274
+ - 275
+ - 276
+ - 277
+ - 278
+ - 279
+ - 280
+ - 281
+ - 282
+ - 283
+ - 284
+ - 285
+ - 286
+ - 287
+ - 288
+ - 289
+ - 290
+ - 291
+ - 292
+ - 293
+ - 294
+ - 295
+ - 296
+ - 297
+ - 298
+ - 299
+ - 300
diff --git a/mocks/github.yaml b/mocks/github.yaml
new file mode 100644
index 0000000000..5c08166d60
--- /dev/null
+++ b/mocks/github.yaml
@@ -0,0 +1,9 @@
+- method: GET
+ path: /github/repos/prefeiturasp/SME-NovoSGP/tags
+ features:
+ delay: 0
+ response:
+ status: 200
+ body:
+ - name: "v.1000"
+ - name: "v.2000"
\ No newline at end of file
diff --git a/mocks/jurema.yaml b/mocks/jurema.yaml
new file mode 100644
index 0000000000..ef6bd60394
--- /dev/null
+++ b/mocks/jurema.yaml
@@ -0,0 +1,8 @@
+- method: GET
+ path: /jurema/v1/learning_objectives
+ features:
+ delay: 0
+ response:
+ status: 200
+ body:
+ message: "ok"
\ No newline at end of file
diff --git a/src/SME.SGP.Api/Configuracoes/RegistraDocumentacaoSwagger.cs b/src/SME.SGP.Api/Configuracoes/RegistraDocumentacaoSwagger.cs
index c2e9ee874e..a88aa05f8c 100644
--- a/src/SME.SGP.Api/Configuracoes/RegistraDocumentacaoSwagger.cs
+++ b/src/SME.SGP.Api/Configuracoes/RegistraDocumentacaoSwagger.cs
@@ -9,10 +9,10 @@ public static class RegistraDocumentacaoSwagger
{
public static void Registrar(IServiceCollection services)
{
- var sp = services.BuildServiceProvider();
-
- var versaoService = sp.GetService();
- var versaoAtual = versaoService?.RecuperarUltimaVersao().Result;
+ var serviceProvider = services.BuildServiceProvider();
+ var versaoService = serviceProvider.GetService()!;
+ var versaoAtual = versaoService.RecuperarUltimaVersao()
+ .GetAwaiter().GetResult();
services.AddSwaggerGen(c =>
{
diff --git a/src/SME.SGP.Api/Configuracoes/RegistrarMvc.cs.rej b/src/SME.SGP.Api/Configuracoes/RegistrarMvc.cs.rej
new file mode 100644
index 0000000000..f266f25bd0
--- /dev/null
+++ b/src/SME.SGP.Api/Configuracoes/RegistrarMvc.cs.rej
@@ -0,0 +1,53 @@
+diff a/src/SME.SGP.Api/Configuracoes/RegistrarMvc.cs b/src/SME.SGP.Api/Configuracoes/RegistrarMvc.cs (rejected hunks)
+@@ -4,35 +4,37 @@ using Microsoft.AspNetCore.Mvc;
+ using Microsoft.Extensions.DependencyInjection;
+ using SME.SGP.Api.Filtros;
+ using SME.SGP.Api.Middlewares;
+-using SME.SGP.Infra;
+-using System.Text.Json.Serialization;
+
++//namespace SME.SGP.Api.Configuracoes
+ namespace SME.SGP.Api
+ {
+ public static class RegistrarMvc
+ {
+ public static void Registrar(IServiceCollection services)
+ {
+- var serviceProvider = services.BuildServiceProvider();
+
++
++
++
+ services.Configure(options =>
+ {
+ options.SuppressModelStateInvalidFilter = true;
+ });
+
+- var conexao = serviceProvider.GetService();
+- var mediator = serviceProvider.GetService();
+-
+ services.AddMvc(options =>
+- {
+- options.EnableEndpointRouting = true;
+- options.Filters.Add(new ValidaDtoAttribute());
+- options.Filters.Add(new FiltroExcecoesAttribute(mediator));
+- options.Filters.Add(new DisposeConnectionFilter(conexao));
+- })
++ {
++ options.EnableEndpointRouting = true;
++ options.Filters.Add();
++ options.Filters.Add();
++ //nao entendi esse filtro, ele recebou uma conexao fixa que sempre vai estar closed depois
++ //da primeira execucao ? Nao esta errada essa declaracao nao se for usar DI nao ?
++ options.Filters.Add();
++ //consulta deveria ter um filtro tambem pra encerrar a conexao ?
++ options.Filters.Add();
++ })
+ .AddNewtonsoftJson()
+ .AddFluentValidation()
+- .SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
++ .SetCompatibilityVersion(CompatibilityVersion.Version_3_0);
+ }
+ }
+ }
+\ No newline at end of file
diff --git a/src/SME.SGP.Api/Controllers/ArmazenamentoController.cs b/src/SME.SGP.Api/Controllers/ArmazenamentoController.cs
index 40c2884238..1af35618ad 100644
--- a/src/SME.SGP.Api/Controllers/ArmazenamentoController.cs
+++ b/src/SME.SGP.Api/Controllers/ArmazenamentoController.cs
@@ -18,20 +18,16 @@ public class ArmazenamentoController : ControllerBase
[ProducesResponseType(200)]
[ProducesResponseType(401)]
[ProducesResponseType(typeof(RetornoBaseDto), 500)]
- //[RequestSizeLimit(200 * 1024 * 1024)]
- public async Task Upload([FromForm] IFormFile file, [FromServices] IUploadDeArquivoUseCase useCase)
+ public async Task Upload([FromForm] IFormFile file,
+ [FromServices] IUploadDeArquivoUseCase useCase)
{
- try
+ if (file.Length > 0)
{
- if (file.Length > 0)
- return Ok(await useCase.Executar(file));
-
- return BadRequest();
- }
- catch (Exception ex)
- {
- throw;
+ var guid = await useCase.Executar(file);
+ return Ok(guid);
}
+
+ return BadRequest();
}
[HttpGet("{codigoArquivo}")]
diff --git a/src/SME.SGP.Api/Controllers/DiarioBordoController.cs b/src/SME.SGP.Api/Controllers/DiarioBordoController.cs
index 133df74395..43cd148d0b 100644
--- a/src/SME.SGP.Api/Controllers/DiarioBordoController.cs
+++ b/src/SME.SGP.Api/Controllers/DiarioBordoController.cs
@@ -106,6 +106,7 @@ public async Task AdicionarObservacao(long diarioBordoId, [FromBo
[ProducesResponseType(typeof(AuditoriaDto), 200)]
[ProducesResponseType(typeof(RetornoBaseDto), 500)]
[Permissao(Permissao.DDB_C, Policy = "Bearer")]
+ //typo alterarrObservacao
public async Task AlterarrObservacao(long observacaoId, [FromBody] ObservacaoDiarioBordoDto dto, [FromServices] IAlterarObservacaoDiarioBordoUseCase alterarObservacaoDiarioBordoUseCase)
{
return Ok(await alterarObservacaoDiarioBordoUseCase.Executar(dto.Observacao, observacaoId, dto.UsuariosIdNotificacao));
diff --git a/src/SME.SGP.Api/Controllers/FechamentoTurmaController.cs b/src/SME.SGP.Api/Controllers/FechamentoTurmaController.cs
index 3f51cb0fed..04215548cc 100644
--- a/src/SME.SGP.Api/Controllers/FechamentoTurmaController.cs
+++ b/src/SME.SGP.Api/Controllers/FechamentoTurmaController.cs
@@ -50,7 +50,7 @@ public async Task Reprocessar(long fechamentoId, [FromServices] I
[ProducesResponseType(typeof(RetornoBaseDto), 500)]
[ProducesResponseType(typeof(RetornoBaseDto), 601)]
[Permissao(Permissao.FB_A, Policy = "Bearer")]
- public async Task Reprocessar(IEnumerable fechamentoId, [FromServices] IComandosFechamentoTurmaDisciplina comandos)
+ public IActionResult Reprocessar(IEnumerable fechamentoId, [FromServices] IComandosFechamentoTurmaDisciplina comandos)
{
comandos.Reprocessar(fechamentoId);
return Ok();
diff --git a/src/SME.SGP.Api/Controllers/VersaoController.cs b/src/SME.SGP.Api/Controllers/VersaoController.cs
index f489812fd8..4c12ec3a14 100644
--- a/src/SME.SGP.Api/Controllers/VersaoController.cs
+++ b/src/SME.SGP.Api/Controllers/VersaoController.cs
@@ -5,9 +5,13 @@
namespace SME.SGP.Api.Controllers
{
+
+ //o frontend esta solicitando essa url na pagina de login
+ //pelo que vi no blame passou a ser autorizada, esta certa essa modificacao? ou o front esta solicitando no momento errado
+ //ou essa autorizacao nao deveria existir aqui
[ApiController]
[Route("api/v1/versoes")]
- [Authorize("Bearer")]
+ [AllowAnonymous]
public class VersaoController : ControllerBase
{
[HttpGet]
diff --git a/src/SME.SGP.Api/Filtros/DisposeConnectionFilter.cs b/src/SME.SGP.Api/Filtros/DisposeConnectionFilter.cs
index 973c224b7e..4714a54917 100644
--- a/src/SME.SGP.Api/Filtros/DisposeConnectionFilter.cs
+++ b/src/SME.SGP.Api/Filtros/DisposeConnectionFilter.cs
@@ -1,10 +1,11 @@
-using Microsoft.AspNetCore.Mvc.Filters;
+using System;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc.Filters;
using SME.SGP.Infra;
-using System;
namespace SME.SGP.Api.Filtros
{
- public class DisposeConnectionFilter : IActionFilter
+ public class DisposeConnectionFilter : IActionFilter, IAsyncActionFilter
{
private readonly ISgpContext sgpContext;
@@ -12,19 +13,22 @@ public DisposeConnectionFilter(ISgpContext sgpContext)
{
this.sgpContext = sgpContext ?? throw new ArgumentNullException(nameof(sgpContext));
}
+
public void OnActionExecuted(ActionExecutedContext context)
{
- if (sgpContext != null && sgpContext.State == System.Data.ConnectionState.Open)
- {
- sgpContext.Close();
- sgpContext.Dispose();
- }
-
+ sgpContext.Close();
}
public void OnActionExecuting(ActionExecutingContext context)
{
+ sgpContext.Open();
+ }
+ public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
+ {
+ await sgpContext.OpenAsync();
+ await next();
+ await sgpContext.CloseAsync();
}
}
}
diff --git a/src/SME.SGP.Api/Filtros/DisposeConnectionFilterConsulta.cs b/src/SME.SGP.Api/Filtros/DisposeConnectionFilterConsulta.cs
new file mode 100644
index 0000000000..cfa63a09b9
--- /dev/null
+++ b/src/SME.SGP.Api/Filtros/DisposeConnectionFilterConsulta.cs
@@ -0,0 +1,35 @@
+using System;
+using System.Threading.Tasks;
+using Microsoft.AspNetCore.Mvc.Filters;
+using SME.SGP.Infra.Interfaces;
+
+namespace SME.SGP.Api.Filtros
+{
+ public class DisposeConnectionFilterConsulta : IActionFilter, IAsyncActionFilter
+ {
+ private readonly ISgpContextConsultas sgpContextConsultas;
+
+ public DisposeConnectionFilterConsulta(ISgpContextConsultas sgpContextConsultas)
+ {
+ this.sgpContextConsultas =
+ sgpContextConsultas ?? throw new ArgumentNullException(nameof(sgpContextConsultas));
+ }
+
+ public void OnActionExecuted(ActionExecutedContext context)
+ {
+ sgpContextConsultas.Close();
+ }
+
+ public void OnActionExecuting(ActionExecutingContext context)
+ {
+ sgpContextConsultas.Open();
+ }
+
+ public async Task OnActionExecutionAsync(ActionExecutingContext context, ActionExecutionDelegate next)
+ {
+ await sgpContextConsultas.OpenAsync();
+ await next();
+ await sgpContextConsultas.CloseAsync();
+ }
+ }
+}
\ No newline at end of file
diff --git a/src/SME.SGP.Api/Middlewares/FiltroExcecoes.cs b/src/SME.SGP.Api/Middlewares/FiltroExcecoes.cs
index 7cf3ffbe72..61f4e37a1a 100644
--- a/src/SME.SGP.Api/Middlewares/FiltroExcecoes.cs
+++ b/src/SME.SGP.Api/Middlewares/FiltroExcecoes.cs
@@ -7,16 +7,19 @@
using SME.SGP.Infra.Excecoes;
using System;
using System.Threading.Tasks;
+using Microsoft.Extensions.Logging;
namespace SME.SGP.Api.Middlewares
{
public class FiltroExcecoesAttribute : ExceptionFilterAttribute
{
private readonly IMediator mediator;
+ private readonly ILogger logger;
- public FiltroExcecoesAttribute(IMediator mediator)
+ public FiltroExcecoesAttribute(IMediator mediator, ILogger logger)
{
this.mediator = mediator ?? throw new ArgumentNullException(nameof(mediator));
+ this.logger = logger;
}
public override async void OnException(ExceptionContext context)
@@ -26,25 +29,31 @@ public override async void OnException(ExceptionContext context)
switch (context.Exception)
{
case NegocioException negocioException:
- await SalvaLogAsync(LogNivel.Negocio, context.Exception.Message, internalIP, context.Exception.StackTrace, context.Exception.InnerException?.ToString());
+ await SalvaLogAsync(LogNivel.Negocio, context.Exception.Message, internalIP,
+ context.Exception.StackTrace, context.Exception.InnerException?.ToString());
context.Result = new ResultadoBaseResult(context.Exception.Message, negocioException.StatusCode);
break;
case ValidacaoException validacaoException:
- await SalvaLogAsync(LogNivel.Negocio, context.Exception.Message, internalIP, context.Exception.StackTrace,context.Exception.InnerException?.ToString());
+ await SalvaLogAsync(LogNivel.Negocio, context.Exception.Message, internalIP,
+ context.Exception.StackTrace,context.Exception.InnerException?.ToString());
context.Result = new ResultadoBaseResult(new RetornoBaseDto(validacaoException.Erros));
break;
default:
- await SalvaLogAsync(LogNivel.Critico, context.Exception.Message, internalIP, context.Exception.StackTrace,context.Exception.InnerException?.ToString());
+ await SalvaLogAsync(LogNivel.Critico, context.Exception.Message, internalIP,
+ context.Exception.StackTrace,context.Exception.InnerException?.ToString());
context.Result = new ResultadoBaseResult("Ocorreu um erro interno. Favor contatar o suporte.", 500);
break;
}
+ //poderia logar essa exception no logger para entender o que esta acontecendo em caso de erro
+ logger.LogError(context.Exception, "");
base.OnException(context);
}
public async Task SalvaLogAsync(LogNivel nivel, string erro, string observacoes, string stackTrace, string innerException)
{
- await mediator.Send(new SalvarLogViaRabbitCommand(erro, nivel, LogContexto.Geral, observacoes, rastreamento: stackTrace,innerException:innerException));
+ await mediator.Send(new SalvarLogViaRabbitCommand(erro, nivel, LogContexto.Geral, observacoes,
+ rastreamento: stackTrace,innerException:innerException));
}
}
}
\ No newline at end of file
diff --git a/src/SME.SGP.Api/Program.cs b/src/SME.SGP.Api/Program.cs
index fdbc36bfb4..1f7cd70818 100644
--- a/src/SME.SGP.Api/Program.cs
+++ b/src/SME.SGP.Api/Program.cs
@@ -6,18 +6,17 @@ namespace SME.SGP.Api
{
public class Program
{
- public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
- WebHost.CreateDefaultBuilder(args)
- .ConfigureAppConfiguration((hostingContext, config) =>
- {
- config.AddEnvironmentVariables();
- config.AddUserSecrets();
- })
- .UseStartup();
-
public static void Main(string[] args)
{
- CreateWebHostBuilder(args).Build().Run();
+ WebHost.CreateDefaultBuilder(args)
+ .ConfigureAppConfiguration((_, configurationBuilder) =>
+ {
+ configurationBuilder.AddEnvironmentVariables();
+ configurationBuilder.AddUserSecrets();
+ })
+ .UseStartup()
+ .Build()
+ .Run();
}
}
}
\ No newline at end of file
diff --git a/src/SME.SGP.Api/SME.SGP.Api.csproj b/src/SME.SGP.Api/SME.SGP.Api.csproj
index 7f08206819..4c20f4f904 100644
--- a/src/SME.SGP.Api/SME.SGP.Api.csproj
+++ b/src/SME.SGP.Api/SME.SGP.Api.csproj
@@ -5,6 +5,7 @@
InProcess
Linux
bcb42d2a-866e-4723-8909-02682cfd7327
+ false
@@ -19,12 +20,11 @@
-
-
+
diff --git a/src/SME.SGP.Api/Startup.cs b/src/SME.SGP.Api/Startup.cs
index 8cebb32ef1..524b0b5a1f 100644
--- a/src/SME.SGP.Api/Startup.cs
+++ b/src/SME.SGP.Api/Startup.cs
@@ -4,7 +4,9 @@
using Elastic.Apm.SqlClient;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
+using Microsoft.AspNetCore.Localization;
using Microsoft.AspNetCore.ResponseCompression;
+using Microsoft.AspNetCore.Server.Kestrel.Core;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
@@ -70,7 +72,6 @@ public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
.AllowCredentials());
app.UseMetricServer();
-
app.UseHttpMetrics();
app.UseAuthentication();
@@ -96,7 +97,7 @@ public void ConfigureServices(IServiceCollection services)
var configTamanhoLimiteRequest = Configuration.GetSection("SGP_MaxRequestSizeBody").Value ?? "104857600";
- services.Configure(options =>
+ services.Configure(options =>
{
options.Limits.MaxRequestBodySize = long.Parse(configTamanhoLimiteRequest);
});
@@ -130,7 +131,8 @@ public void ConfigureServices(IServiceCollection services)
services.Configure(options =>
{
options.DefaultRequestCulture = new Microsoft.AspNetCore.Localization.RequestCulture("pt-BR");
- options.SupportedCultures = new List { new("pt-BR"), new("pt-BR") };
+ //ta duplicado esse culture mesmo ?
+ options.SupportedCultures = new List {new("pt-BR")};
});
services.AddHealthChecksUiSgp()
diff --git a/src/SME.SGP.Api/Startup.cs.rej b/src/SME.SGP.Api/Startup.cs.rej
new file mode 100644
index 0000000000..9dc1711f31
--- /dev/null
+++ b/src/SME.SGP.Api/Startup.cs.rej
@@ -0,0 +1,16 @@
+diff a/src/SME.SGP.Api/Startup.cs b/src/SME.SGP.Api/Startup.cs (rejected hunks)
+@@ -83,9 +84,11 @@ namespace SME.SGP.Api
+ if (threadPoolOptions.WorkerThreads > 0 && threadPoolOptions.CompletionPortThreads > 0)
+ ThreadPool.SetMinThreads(threadPoolOptions.WorkerThreads, threadPoolOptions.CompletionPortThreads);
+
+- Console.WriteLine("CURRENT------", Directory.GetCurrentDirectory());
+- Console.WriteLine("COMBINE------", Path.Combine(Directory.GetCurrentDirectory(), @"Imagens"));
+-
++ //ideal é sempre usar log para logar essas coisas
++ //esses parametros tambem nao serao printados no console do jeito que estao
++ Console.WriteLine("CURRENT {0}:", Directory.GetCurrentDirectory());
++ Console.WriteLine("COMBINE {0}:", Path.Combine(Directory.GetCurrentDirectory(), @"Imagens"));
++
+ app.UseHealthChecksSgp();
+ app.UseHealthCheckPrometheusSgp();
+ }
diff --git a/src/SME.SGP.Api/appsettings.json b/src/SME.SGP.Api/appsettings.json
index 21a72d57f3..911a2573ee 100644
--- a/src/SME.SGP.Api/appsettings.json
+++ b/src/SME.SGP.Api/appsettings.json
@@ -1,8 +1,44 @@
{
"ConnectionStrings": {
- "SGP_Postgres": "",
+ "SGP_Postgres": "Host=localhost;Port=5432;Database=sgp_db;Username=postgres;Password=postgres;Timeout=30;Pooling=True;Maximum Pool Size=40;Application Name=SGP_DB",
+ "SGP_PostgresConsultas": "Host=localhost;Port=5432;Database=sgp_db;Username=postgres;Password=postgres;Timeout=30;Pooling=True;Maximum Pool Size=40;Application Name=SGP_DB_CONSULTA",
"SGP_Redis": ""
},
+ "ElasticApm" : {
+ "ServerUrl": "http://localhost:8080/apm/"
+ },
+ "JwtTokenSettings": {
+ "Audience": "ClientApp",
+ "ExpiresInMinutes": "525960",
+ "Issuer": "IPT",
+ "IssuerSigningKey": "f0d9ai0f908dsamufmud89saum0fud0sa89uf0d9s8af098dsa"
+ },
+ "UrlApiEOL": "http://localhost:8080/eol/",
+ "UrlApiJurema": "http://localhost:8080/jurema/",
+ "UrlApiAE": "http://localhost:8080/ae/",
+ "ConfiguracaoRabbitLog" : {
+ "Port" : 5672,
+ "HostName": "localhost",
+ "Password": "rabbitmq",
+ "UserName": "rabbitmq",
+ "Virtualhost": "dev"
+ },
+ "ConfiguracaoRabbit": {
+ "Port" : 5672,
+ "HostName": "localhost",
+ "Password": "rabbitmq",
+ "UserName": "rabbitmq",
+ "Virtualhost": "dev"
+ },
+ "UrlApiGithub": "http://localhost:8080/github/",
+ "UsuarioGithub": "xxxxx",
+ "SenhaGithub": "xxxxx",
+ "Telemetria" : {
+ "ApplicationInsights": false,
+ "Apm": false
+ },
+
+
"API_URL": "",
"ASPNETCORE_ENVIRONMENT": "",
"ApiKeyEolApi": "",
@@ -10,16 +46,10 @@
"ObjetivosAprendizagem": ""
},
"FF_BackgroundEnabled": "",
- "JwtTokenSettings": {
- "Audience": "",
- "ExpiresInMinutes": "",
- "Issuer": "",
- "IssuerSigningKey": ""
- },
"Logging": {
"LogLevel": {
- "Default": "",
- "Microsoft": ""
+ "Default": "Error",
+ "Microsoft": "Error"
}
},
"Nome_Instancia_Redis": "",
@@ -28,8 +58,6 @@
"DSN": ""
},
"TZ": "",
- "UrlApiEOL": "",
- "UrlApiJurema": "",
"UrlFrontEnd": "",
"AE_ChaveIntegracao": "",
"ApplicationInsights": {
@@ -40,22 +68,12 @@
"Username": "",
"Password": ""
},
- "ConfiguracaoRabbit": {
- "HostName": "",
- "Password": "",
- "UserName": "",
- "Virtualhost": ""
- },
"HangfireUser": {
"Admin": "",
"Basic": ""
},
- "SenhaGithub": "",
"TRACKING_ID": "",
- "UrlApiAE": "",
- "UrlApiGithub": "",
"UrlBackEnd": "",
"UrlServidorRelatorios": "",
- "UsuarioGithub": "",
"VIEW_ID": ""
}
diff --git a/src/SME.SGP.Aplicacao/CasosDeUso/Abrangencia/ObterAbrangenciaDresUseCase.cs b/src/SME.SGP.Aplicacao/CasosDeUso/Abrangencia/ObterAbrangenciaDresUseCase.cs
index 22cab6fbc5..2d1962e048 100644
--- a/src/SME.SGP.Aplicacao/CasosDeUso/Abrangencia/ObterAbrangenciaDresUseCase.cs
+++ b/src/SME.SGP.Aplicacao/CasosDeUso/Abrangencia/ObterAbrangenciaDresUseCase.cs
@@ -7,6 +7,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
+using SME.SGP.Infra.Utilitarios;
namespace SME.SGP.Aplicacao
{
@@ -16,13 +17,17 @@ public ObterAbrangenciaDresUseCase(IMediator mediator) : base(mediator)
{
}
- public async Task> Executar(Modalidade? modalidade, int periodo = 0, bool consideraHistorico = false, int anoLetivo = 0, string filtro = "")
+ public async Task> Executar(Modalidade? modalidade, int periodo = 0,
+ bool consideraHistorico = false, int anoLetivo = 0, string filtro = "")
{
- var login = await mediator
- .Send(new ObterLoginAtualQuery());
- var perfil = await mediator
- .Send(new ObterPerfilAtualQuery());
+ //Como essas instancia de query nao possuem parametro definido da pra usar sempre a mesma instancia
+ //evitando alocacao de memoria
+ var loginTask = mediator
+ .Send(ObterLoginAtualQuery.Instance);
+
+ var perfilTask = mediator
+ .Send(ObterPerfilAtualQuery.Instance);
var filtroEhCodigo = false;
@@ -32,8 +37,22 @@ public async Task> Executar(Modalidade? mo
filtroEhCodigo = true;
}
+ //tem varios casos de use cases de computacoes distintas que estao aguardando umas as outras para executar
+ //nesses casos pode disparar todas ao mesmo tempo ja que sao interdependentes e acumular no final o resultado
+ //Um caso é utilizar whenall da plataforma
+ await UtilTasks.WhenAll(loginTask, perfilTask);
+
+ //Outro caso é usar o await depois de todas as chamadas assincronas
+ var login = await loginTask;
+ var perfil = await perfilTask;
+
return await mediator
- .Send(new ObterAbrangenciaDresQuery(login, perfil, modalidade, periodo, consideraHistorico, anoLetivo, filtro, filtroEhCodigo));
+ .Send(new ObterAbrangenciaDresQuery(login, perfil, modalidade, periodo, consideraHistorico, anoLetivo,
+ filtro, filtroEhCodigo));
}
+
+
+
+
}
}
\ No newline at end of file
diff --git a/src/SME.SGP.Aplicacao/CasosDeUso/Abrangencia/ObterModalidadesPorAnoUseCase.cs b/src/SME.SGP.Aplicacao/CasosDeUso/Abrangencia/ObterModalidadesPorAnoUseCase.cs
index 007169db22..099bba0762 100644
--- a/src/SME.SGP.Aplicacao/CasosDeUso/Abrangencia/ObterModalidadesPorAnoUseCase.cs
+++ b/src/SME.SGP.Aplicacao/CasosDeUso/Abrangencia/ObterModalidadesPorAnoUseCase.cs
@@ -6,6 +6,7 @@
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
+using SME.SGP.Infra.Utilitarios;
namespace SME.SGP.Aplicacao
{
@@ -20,15 +21,31 @@ public ObterModalidadesPorAnoUseCase(IMediator mediator)
public async Task> Executar(int anoLetivo, bool consideraHistorico, bool consideraNovasModalidades)
{
- var login = await mediator
- .Send(new ObterLoginAtualQuery());
+ //Como essas instancia de query nao possuem parametro definido da pra usar sempre a mesma instancia
+ //evitando alocacao de memoria para esses casos
+ var loginTask = mediator
+ .Send(ObterLoginAtualQuery.Instance);
- var perfil = await mediator
- .Send(new ObterPerfilAtualQuery());
+ //Como essas instancia de query nao possuem parametro definido da pra usar sempre a mesma instancia
+ //evitando alocacao de memoria para esses casos
+ var perfilTask = mediator
+ .Send(ObterPerfilAtualQuery.Instance);
- var modalidadesQueSeraoIgnoradas = await mediator
+ var modalidadesQueSeraoIgnoradasTask = mediator
.Send(new ObterNovasModalidadesPorAnoQuery(anoLetivo, consideraNovasModalidades));
+ //tem varios casos de use cases de computacoes distintas que estao aguardando umas as outras para executar com awaits encadeados
+ //nesses casos pode disparar todas ao mesmo tempo ja que sao interdependentes e acumular no final o resultado
+ //Um caso é utilizar whenall da plataforma
+ await UtilTasks.WhenAll(loginTask, perfilTask,modalidadesQueSeraoIgnoradasTask);
+
+ //Outro caso é usar o await depois de todas as chamadas assincronas serem feitas, pra todos os efeitos nao da pra ter certeza se nesses
+ //casos que o comportamento bloqueia da mesma maneira na sequencia que não é desejavel e ainda nesses casos seriam 3 chamadas de state machine
+ //contra apenas uma da utilizacao de whenAll + Result
+ var login = loginTask.Result; //exemplo com Result que nesse caso é garantido estar computado e nao cria state machine
+ var perfil = await perfilTask; //exemplo com await ja Completed. Nesse caso vai criar state machine que vai executar direto, so fica codigo compilado a mais so, nao tem punicao.
+ var modalidadesQueSeraoIgnoradas = await modalidadesQueSeraoIgnoradasTask;
+
return await mediator
.Send(new ObterModalidadesPorAnoQuery(anoLetivo, consideraHistorico, login, perfil, modalidadesQueSeraoIgnoradas));
}
diff --git a/src/SME.SGP.Aplicacao/CasosDeUso/RabbitDeadletter/RabbitDeadletterSgpTratarUseCase.cs b/src/SME.SGP.Aplicacao/CasosDeUso/RabbitDeadletter/RabbitDeadletterSgpTratarUseCase.cs
index 28b6e2235f..9786b3b784 100644
--- a/src/SME.SGP.Aplicacao/CasosDeUso/RabbitDeadletter/RabbitDeadletterSgpTratarUseCase.cs
+++ b/src/SME.SGP.Aplicacao/CasosDeUso/RabbitDeadletter/RabbitDeadletterSgpTratarUseCase.cs
@@ -25,15 +25,17 @@ public async Task Executar(MensagemRabbit mensagemRabbit)
{
var fila = mensagemRabbit.Mensagem.ToString();
- var factory = new ConnectionFactory
+ var configuracaoRabbit = configuration.GetSection("ConfiguracaoRabbit");
+ var connectionFactory = new ConnectionFactory
{
- HostName = configuration.GetSection("ConfiguracaoRabbit:HostName").Value,
- UserName = configuration.GetSection("ConfiguracaoRabbit:UserName").Value,
- Password = configuration.GetSection("ConfiguracaoRabbit:Password").Value,
- VirtualHost = configuration.GetSection("ConfiguracaoRabbit:Virtualhost").Value
+ Port = configuracaoRabbit.GetValue("Port"),
+ HostName = configuracaoRabbit.GetValue("HostName"),
+ UserName = configuracaoRabbit.GetValue("UserName"),
+ Password = configuracaoRabbit.GetValue("Password"),
+ VirtualHost = configuracaoRabbit.GetValue("Virtualhost")
};
- await policy.ExecuteAsync(() => TratarMensagens(fila, factory));
+ await policy.ExecuteAsync(() => TratarMensagens(fila, connectionFactory));
return await Task.FromResult(true);
}
@@ -52,6 +54,7 @@ private async Task TratarMensagens(string fila, ConnectionFactory factory)
break;
else
{
+ //essa mensagem não é persistente ?
await Task.Run(() => _channel.BasicPublish(ExchangeSgpRabbit.Sgp, fila, null, mensagemParaEnviar.Body.ToArray()));
}
}
diff --git a/src/SME.SGP.Aplicacao/CasosDeUso/RabbitDeadletter/RabbitDeadletterSrTratarUseCase.cs b/src/SME.SGP.Aplicacao/CasosDeUso/RabbitDeadletter/RabbitDeadletterSrTratarUseCase.cs
index a39c58a5cd..a3c51948ec 100644
--- a/src/SME.SGP.Aplicacao/CasosDeUso/RabbitDeadletter/RabbitDeadletterSrTratarUseCase.cs
+++ b/src/SME.SGP.Aplicacao/CasosDeUso/RabbitDeadletter/RabbitDeadletterSrTratarUseCase.cs
@@ -6,10 +6,18 @@
using SME.SGP.Aplicacao.Interfaces;
using SME.SGP.Infra;
using System;
+using System.Collections;
+using System.Collections.Generic;
+using System.Text;
using System.Threading.Tasks;
+using RabbitMQ.Client.Events;
namespace SME.SGP.Aplicacao.CasosDeUso
{
+
+
+ //nao seria mais interessante trabalhar com modelo de consumer de mensagem ao inves de polling? channel.BasicConsume algo do tipo
+ //e nao ficar relancando todas vezes
public class RabbitDeadletterSrTratarUseCase : IRabbitDeadletterSrTratarUseCase
{
private readonly IConfiguration configuration;
@@ -21,42 +29,110 @@ public RabbitDeadletterSrTratarUseCase(IConfiguration configuration, IReadOnlyPo
this.policy = registry.Get(PoliticaPolly.PublicaFila);
}
+
public async Task Executar(MensagemRabbit mensagemRabbit)
{
var fila = mensagemRabbit.Mensagem.ToString();
- var factory = new ConnectionFactory
+ var configuracaoRabbit = configuration.GetSection("ConfiguracaoRabbit");
+ var connectionFactory = new ConnectionFactory
{
- HostName = configuration.GetSection("ConfiguracaoRabbit:HostName").Value,
- UserName = configuration.GetSection("ConfiguracaoRabbit:UserName").Value,
- Password = configuration.GetSection("ConfiguracaoRabbit:Password").Value,
- VirtualHost = configuration.GetSection("ConfiguracaoRabbit:Virtualhost").Value
+ Port = configuracaoRabbit.GetValue("Port"),
+ HostName = configuracaoRabbit.GetValue("HostName"),
+ UserName = configuracaoRabbit.GetValue("UserName"),
+ Password = configuracaoRabbit.GetValue("Password"),
+ VirtualHost = configuracaoRabbit.GetValue("Virtualhost")
};
- await policy.ExecuteAsync(() => TratarMensagens(fila, factory));
+ await policy.ExecuteAsync(() => TratarMensagens(fila, connectionFactory));
- return await Task.FromResult(true);
+ //da pra retornar direto aqui nao ?
+ return true;
}
private async Task TratarMensagens(string fila, ConnectionFactory factory)
{
- using (var conexaoRabbit = factory.CreateConnection())
- {
- using (IModel _channel = conexaoRabbit.CreateModel())
- {
- while (true)
- {
- var mensagemParaEnviar = _channel.BasicGet($"{fila}.deadletter", true);
-
- if (mensagemParaEnviar == null)
- break;
- else
- {
- await Task.Run(() => _channel.BasicPublish(ExchangeSgpRabbit.ServidorRelatorios, fila, null, mensagemParaEnviar.Body.ToArray()));
- }
- }
- }
+ using var conexaoRabbit = factory.CreateConnection();
+ using var channel = conexaoRabbit.CreateModel();
+
+ //Nao seria ideal gerenciar esses tipos de controle de loop com algum dispose para suportar graceful shutdown
+ //caso precise parar essas threads dos workers fora do laco de while ?
+ //while (running) algo assim com dispose que seta running para false
+ //ou ate mesmo algo mais inteligente no while como readers como enumerables
+
+ //var basicGetResults = BasicGetResults(channel, $"{fila}.deadletter");
+ var basicGetResults = new BasicGetResultEnumerable(channel, $"{fila}.deadletter");
+ foreach(var basicGetResult in basicGetResults)
+ {
+ //essa mensagem não é persistente ?
+ await Task.Run(() => channel.BasicPublish(ExchangeSgpRabbit.ServidorRelatorios, fila, null, basicGetResult.Body.ToArray()));
+ }
+
+ }
+
+ //Ou metodo estatico com yield return ou algo do tipo
+ public IEnumerable BasicGetResults(IModel channel, string fila)
+ {
+ BasicGetResult basicGetResult;
+ while ((basicGetResult = channel.BasicGet(fila, true)) is not null)
+ {
+ yield return basicGetResult;
}
}
+
+ //Ou talvez extrair esse reader em uma classe separada que outros usariam para o modelo de pooling
+ public class BasicGetResultEnumerable : IEnumerable,IDisposable
+ {
+ private readonly IModel _channel;
+ private readonly string _fila;
+
+ public BasicGetResultEnumerable(IModel channel, string fila)
+ {
+ _channel = channel;
+ _fila = fila;
+ }
+
+ public IEnumerator GetEnumerator() => new BasicGetResultEnumerator(_channel,_fila);
+ IEnumerator IEnumerable.GetEnumerator() => new BasicGetResultEnumerator(_channel,_fila);
+
+ public void Dispose()
+ {
+
+ }
+
+ }
+
+ public class BasicGetResultEnumerator : IEnumerator
+ {
+ private readonly IModel _channel;
+ private readonly string _fila;
+ private BasicGetResult _current;
+
+ public BasicGetResultEnumerator(IModel channel, string fila)
+ {
+ _channel = channel;
+ _fila = fila;
+ }
+
+ public bool MoveNext()
+ {
+ _current = _channel.BasicGet(_fila, true);
+ return _current is not null;
+ }
+
+ public void Reset()
+ {
+
+ }
+
+ public BasicGetResult Current => _current;
+ object IEnumerator.Current => _current;
+
+ public void Dispose()
+ {
+
+ }
+ }
+
}
}
diff --git a/src/SME.SGP.Aplicacao/CasosDeUso/RotasAgendamentoSync/RotasAgendamentoTratarUseCase.cs b/src/SME.SGP.Aplicacao/CasosDeUso/RotasAgendamentoSync/RotasAgendamentoTratarUseCase.cs
index 8b3f511948..7cbd5f33c7 100644
--- a/src/SME.SGP.Aplicacao/CasosDeUso/RotasAgendamentoSync/RotasAgendamentoTratarUseCase.cs
+++ b/src/SME.SGP.Aplicacao/CasosDeUso/RotasAgendamentoSync/RotasAgendamentoTratarUseCase.cs
@@ -30,15 +30,17 @@ public async Task Executar(MensagemRabbit mensagemRabbit)
{
var fila = mensagemRabbit.Mensagem.ToString();
- var factory = new ConnectionFactory
+ var configuracaoRabbit = configuration.GetSection("ConfiguracaoRabbit");
+ var connectionFactory = new ConnectionFactory
{
- HostName = configuration.GetSection("ConfiguracaoRabbit:HostName").Value,
- UserName = configuration.GetSection("ConfiguracaoRabbit:UserName").Value,
- Password = configuration.GetSection("ConfiguracaoRabbit:Password").Value,
- VirtualHost = configuration.GetSection("ConfiguracaoRabbit:Virtualhost").Value
+ Port = configuracaoRabbit.GetValue("Port"),
+ HostName = configuracaoRabbit.GetValue("HostName"),
+ UserName = configuracaoRabbit.GetValue("UserName"),
+ Password = configuracaoRabbit.GetValue("Password"),
+ VirtualHost = configuracaoRabbit.GetValue("Virtualhost")
};
- await policy.ExecuteAsync(() => TratarMensagens(fila, factory));
+ await policy.ExecuteAsync(() => TratarMensagens(fila, connectionFactory));
return true;
}
diff --git a/src/SME.SGP.Aplicacao/Comandos/ComandosNotificacao.cs b/src/SME.SGP.Aplicacao/Comandos/ComandosNotificacao.cs
index dec2984d43..a2290497e1 100644
--- a/src/SME.SGP.Aplicacao/Comandos/ComandosNotificacao.cs
+++ b/src/SME.SGP.Aplicacao/Comandos/ComandosNotificacao.cs
@@ -86,15 +86,15 @@ public async Task> MarcarComoLida(IList MapearParaDominio(NotificacaoDto notificacaoDto)
{
- var notificacao = new Notificacao()
+ var notificacao = new Notificacao
{
Categoria = notificacaoDto.Categoria,
DreId = notificacaoDto.DreId,
@@ -107,27 +107,22 @@ private Notificacao MapearParaDominio(NotificacaoDto notificacaoDto)
Codigo = notificacaoDto.Codigo
};
- TrataUsuario(notificacao, notificacaoDto.UsuarioRf);
-
- return notificacao;
+ return await TrataUsuario(notificacao, notificacaoDto.UsuarioRf);
}
private Notificacao ObterPorIdENotificarCasoNaoExista(long notificacaoId)
{
- Notificacao notificacao = repositorioNotificacao.ObterPorId(notificacaoId);
- if (notificacao == null)
- {
- throw new NegocioException($"Notificação com id: '{notificacaoId}' não encontrada.");
- }
-
- return notificacao;
+ return repositorioNotificacao.ObterPorId(notificacaoId) ??
+ throw new NegocioException($"Notificação com id: '{notificacaoId}' não encontrada.");
}
- private async void TrataUsuario(Notificacao notificacao, string usuarioRf)
+ //Evitar uso de async void que pode derrubar uma instancia inteira de aplicacao caso lance uma exception
+ private async Task TrataUsuario(Notificacao notificacao, string usuarioRf)
{
var usuario = await servicoUsuario.ObterUsuarioPorCodigoRfLoginOuAdiciona(usuarioRf);
notificacao.Usuario = usuario;
notificacao.UsuarioId = usuario.Id;
+ return notificacao;
}
}
}
\ No newline at end of file
diff --git a/src/SME.SGP.Aplicacao/Comandos/ComandosPlanoAnual.cs b/src/SME.SGP.Aplicacao/Comandos/ComandosPlanoAnual.cs
index f9286663ee..9188628f0c 100644
--- a/src/SME.SGP.Aplicacao/Comandos/ComandosPlanoAnual.cs
+++ b/src/SME.SGP.Aplicacao/Comandos/ComandosPlanoAnual.cs
@@ -87,6 +87,9 @@ public void Migrar(MigrarPlanoAnualDto migrarPlanoAnualDto)
}
}
unitOfWork.PersistirTransacao();
+
+
+ //Nao tem rotina de rollback pra esse caso?
}
public async Task> Salvar(PlanoAnualDto planoAnualDto)
diff --git a/src/SME.SGP.Aplicacao/Comandos/ComandosUsuario.cs b/src/SME.SGP.Aplicacao/Comandos/ComandosUsuario.cs
index 6a4e67ca4c..8fa0bdc376 100644
--- a/src/SME.SGP.Aplicacao/Comandos/ComandosUsuario.cs
+++ b/src/SME.SGP.Aplicacao/Comandos/ComandosUsuario.cs
@@ -173,6 +173,7 @@ public async Task ModificarPerfil(Guid perfil)
};
var dadosAcesso = await servicoEOL.CarregarDadosAcessoPorLoginPerfil(loginAtual, perfil, administradorSuporte);
+ //aqui pode dar nullpointer em dadosAcesso nao?
var permissionamentos = dadosAcesso.Permissoes.ToList();
if (permissionamentos == null || !permissionamentos.Any())
@@ -236,6 +237,9 @@ public async Task RevalidarLogin()
// Busca lista de permissões do EOL
var dadosAcesso = await servicoEOL.CarregarDadosAcessoPorLoginPerfil(login, guidPerfil);
+ //aqui pode dar nullpointer em dadosAcesso nao?
+
+
var permissionamentos = dadosAcesso.Permissoes.ToList();
if (!permissionamentos.Any())
diff --git a/src/SME.SGP.Aplicacao/Comandos/ComandosUsuario.cs.rej b/src/SME.SGP.Aplicacao/Comandos/ComandosUsuario.cs.rej
new file mode 100644
index 0000000000..d3f359b839
--- /dev/null
+++ b/src/SME.SGP.Aplicacao/Comandos/ComandosUsuario.cs.rej
@@ -0,0 +1,94 @@
+diff a/src/SME.SGP.Aplicacao/Comandos/ComandosUsuario.cs b/src/SME.SGP.Aplicacao/Comandos/ComandosUsuario.cs (rejected hunks)
+@@ -1,12 +1,12 @@
+-using MediatR;
++using System;
++using System.Collections.Generic;
++using System.Linq;
++using System.Threading.Tasks;
++using MediatR;
+ using SME.SGP.Aplicacao.Integracoes;
+ using SME.SGP.Dominio;
+ using SME.SGP.Dominio.Interfaces;
+ using SME.SGP.Infra;
+-using System;
+-using System.Collections.Generic;
+-using System.Linq;
+-using System.Threading.Tasks;
+
+ namespace SME.SGP.Aplicacao
+ {
+@@ -91,26 +91,28 @@ namespace SME.SGP.Aplicacao
+ {
+ login = login.Trim().ToLower();
+ var retornoAutenticacaoEol = await servicoAutenticacao.AutenticarNoEol(login, senha);
+-
+ return await ObterAutenticacao(retornoAutenticacaoEol, login);
+ }
+-
+- public async Task ObterAutenticacao((UsuarioAutenticacaoRetornoDto, string, IEnumerable, bool, bool)
++
++
++ //sugestao de nomear tuplas se for manter ou trocar para records ou tipos de estrutura mais flexiveis
++ //que encapsulem o retorno. Nomeando a tuple fica bem mais legivel a logica executada
++ public async Task ObterAutenticacao((UsuarioAutenticacaoRetornoDto UsuarioAutenticacaoRetornoDto, string CodigoRf, IEnumerable Perfis, bool PossuiCargoCJ, bool PossuiPerfilCJ)
+ retornoAutenticacaoEol, string login, AdministradorSuporteDto administradorSuporte = null)
+ {
+- if (!retornoAutenticacaoEol.Item1.Autenticado)
+- return retornoAutenticacaoEol.Item1;
++ if (!retornoAutenticacaoEol.UsuarioAutenticacaoRetornoDto.Autenticado)
++ return retornoAutenticacaoEol.UsuarioAutenticacaoRetornoDto;
+
+ var dadosUsuario = await servicoEOL.ObterMeusDados(login);
+
+- var usuario = await servicoUsuario.ObterUsuarioPorCodigoRfLoginOuAdiciona(retornoAutenticacaoEol.Item2, login, dadosUsuario.Nome, dadosUsuario.Email, true);
++ var usuario = await servicoUsuario.ObterUsuarioPorCodigoRfLoginOuAdiciona(retornoAutenticacaoEol.CodigoRf, login, dadosUsuario.Nome, dadosUsuario.Email, true);
+
+- retornoAutenticacaoEol.Item1.PerfisUsuario = await servicoPerfil.DefinirPerfilPrioritario(retornoAutenticacaoEol.Item3, usuario);
++ retornoAutenticacaoEol.UsuarioAutenticacaoRetornoDto.PerfisUsuario = await servicoPerfil.DefinirPerfilPrioritario(retornoAutenticacaoEol.Perfis, usuario);
+
+- var perfis = retornoAutenticacaoEol.Item1.PerfisUsuario.Perfis.Select(x => x.CodigoPerfil).ToList();
+- servicoAbrangencia.RemoverAbrangenciasHistoricasIncorretas(login, perfis);
++ var perfis = retornoAutenticacaoEol.UsuarioAutenticacaoRetornoDto.PerfisUsuario.Perfis.Select(x => x.CodigoPerfil).ToList();
++ await servicoAbrangencia.RemoverAbrangenciasHistoricasIncorretas(login, perfis);
+
+- var perfilSelecionado = retornoAutenticacaoEol.Item1.PerfisUsuario.PerfilSelecionado;
++ var perfilSelecionado = retornoAutenticacaoEol.UsuarioAutenticacaoRetornoDto.PerfisUsuario.PerfilSelecionado;
+
+ var dadosAcesso = await servicoEOL.CarregarDadosAcessoPorLoginPerfil(login, perfilSelecionado, administradorSuporte);
+
+@@ -118,25 +120,25 @@ namespace SME.SGP.Aplicacao
+
+ if (!permissionamentos.Any())
+ {
+- retornoAutenticacaoEol.Item1.Autenticado = false;
+- return retornoAutenticacaoEol.Item1;
++ retornoAutenticacaoEol.UsuarioAutenticacaoRetornoDto.Autenticado = false;
++ return retornoAutenticacaoEol.UsuarioAutenticacaoRetornoDto;
+ }
+-
+- retornoAutenticacaoEol.Item1.Token = dadosAcesso.Token;
+- retornoAutenticacaoEol.Item1.DataHoraExpiracao = dadosAcesso.DataExpiracaoToken;
++
++ retornoAutenticacaoEol.UsuarioAutenticacaoRetornoDto.Token = dadosAcesso.Token;
++ retornoAutenticacaoEol.UsuarioAutenticacaoRetornoDto.DataHoraExpiracao = dadosAcesso.DataExpiracaoToken;
+
+ usuario.AtualizaUltimoLogin();
+ await mediator.Send(new PublicarFilaSgpCommand(RotasRabbitSgp.AtualizaUltimoLoginUsuario, usuario));
+
+ await mediator.Send(new CarregarAbrangenciaUsuarioCommand(login, perfilSelecionado));
+
+- retornoAutenticacaoEol.Item1.UsuarioLogin = usuario.Login;
+- retornoAutenticacaoEol.Item1.UsuarioRf = usuario.CodigoRf;
+- retornoAutenticacaoEol.Item1.AdministradorSuporte = administradorSuporte;
++ retornoAutenticacaoEol.UsuarioAutenticacaoRetornoDto.UsuarioLogin = usuario.Login;
++ retornoAutenticacaoEol.UsuarioAutenticacaoRetornoDto.UsuarioRf = usuario.CodigoRf;
++ retornoAutenticacaoEol.UsuarioAutenticacaoRetornoDto.AdministradorSuporte = administradorSuporte;
+
+- return retornoAutenticacaoEol.Item1;
++ return retornoAutenticacaoEol.UsuarioAutenticacaoRetornoDto;
+ }
+-
++
+ public async Task ModificarPerfil(Guid perfil)
+ {
+ var loginAtual = servicoUsuario.ObterLoginAtual();
diff --git a/src/SME.SGP.Aplicacao/Commands/Arquivos/MoverArquivosTemporarios/MoverArquivosTemporariosCommandHandler.cs b/src/SME.SGP.Aplicacao/Commands/Arquivos/MoverArquivosTemporarios/MoverArquivosTemporariosCommandHandler.cs
index f8b97c6696..6f38a952a8 100644
--- a/src/SME.SGP.Aplicacao/Commands/Arquivos/MoverArquivosTemporarios/MoverArquivosTemporariosCommandHandler.cs
+++ b/src/SME.SGP.Aplicacao/Commands/Arquivos/MoverArquivosTemporarios/MoverArquivosTemporariosCommandHandler.cs
@@ -15,6 +15,12 @@ public class MoverArquivosTemporariosCommandHandler : IRequestHandler configuracaoArmazenamentoOptions)
{
@@ -23,16 +29,15 @@ public MoverArquivosTemporariosCommandHandler(IMediator mediator,IOptions Handle(MoverArquivosTemporariosCommand request, CancellationToken cancellationToken)
{
- var regex = new Regex(ArmazenamentoObjetos.EXPRESSAO_NOME_ARQUIVO);
- var regexImagensPasta = new Regex(ArmazenamentoObjetos.EXPRESSAO_NOME_ARQUIVO_COM_PASTA);
- var novo = regex.Matches(request.TextoEditorNovo).Cast().Select(c => c.Value).ToList();
- var atual = regex.Matches(!string.IsNullOrEmpty(request.TextoEditorAtual) ? request.TextoEditorAtual : string.Empty).Cast().Select(c => c.Value).ToList();
+ var novo = Regex.Matches(request.TextoEditorNovo).Cast().Select(c => c.Value).ToList();
+ var atual = Regex.Matches(!string.IsNullOrEmpty(request.TextoEditorAtual) ? request.TextoEditorAtual : string.Empty).Cast().Select(c => c.Value).ToList();
- var imagensEditorNovo = regexImagensPasta.Matches(request.TextoEditorNovo).Cast().Select(c => c.Value).ToList();
+ var imagensEditorNovo = RegexImagensPasta.Matches(request.TextoEditorNovo).Cast().Select(c => c.Value).ToList();
novo = imagensEditorNovo.Any() ? RetornaImagensTemporariasParaMover(imagensEditorNovo) : novo;
- var diferenca = novo.Any() ? novo.Except(atual) : new List();
+ //precisaria nem alocar uma lista vazia
+ var diferenca = novo.Any() ? novo.Except(atual) : Enumerable.Empty();
foreach (var item in diferenca)
{
diff --git a/src/SME.SGP.Aplicacao/Commands/AtribuicaoCJ/InserirAtribuicaoCJ/InserirAtribuicaoCJCommandHandler.cs.rej b/src/SME.SGP.Aplicacao/Commands/AtribuicaoCJ/InserirAtribuicaoCJ/InserirAtribuicaoCJCommandHandler.cs.rej
new file mode 100644
index 0000000000..c5799a74cd
--- /dev/null
+++ b/src/SME.SGP.Aplicacao/Commands/AtribuicaoCJ/InserirAtribuicaoCJ/InserirAtribuicaoCJCommandHandler.cs.rej
@@ -0,0 +1,10 @@
+diff a/src/SME.SGP.Aplicacao/Commands/AtribuicaoCJ/InserirAtribuicaoCJ/InserirAtribuicaoCJCommandHandler.cs b/src/SME.SGP.Aplicacao/Commands/AtribuicaoCJ/InserirAtribuicaoCJ/InserirAtribuicaoCJCommandHandler.cs (rejected hunks)
+@@ -96,7 +96,7 @@ namespace SME.SGP.Aplicacao
+ (!atribuicoesAtuais.Any(a => a.Id != atribuicaoCJ.Id && a.Substituir)))
+ {
+ if (ehHistorico)
+- repositorioAbrangencia.ExcluirAbrangenciasHistoricas(abrangenciasAtuais.Select(a => a.Id).ToArray());
++ await repositorioAbrangencia.ExcluirAbrangenciasHistoricas(abrangenciasAtuais.Select(a => a.Id).ToArray());
+ else
+ repositorioAbrangencia.ExcluirAbrangencias(abrangenciasAtuais.Select(a => a.Id).ToArray());
+
diff --git a/src/SME.SGP.Aplicacao/Commands/DiarioBordo/AlterarObservacaoDiarioBordo/AlterarObservacaoDiarioBordoCommandHandler.cs b/src/SME.SGP.Aplicacao/Commands/DiarioBordo/AlterarObservacaoDiarioBordo/AlterarObservacaoDiarioBordoCommandHandler.cs
index 551a0a1f85..cf99922bcb 100644
--- a/src/SME.SGP.Aplicacao/Commands/DiarioBordo/AlterarObservacaoDiarioBordo/AlterarObservacaoDiarioBordoCommandHandler.cs
+++ b/src/SME.SGP.Aplicacao/Commands/DiarioBordo/AlterarObservacaoDiarioBordo/AlterarObservacaoDiarioBordoCommandHandler.cs
@@ -27,7 +27,6 @@ public AlterarObservacaoDiarioBordoCommandHandler(IRepositorioDiarioBordoObserva
public async Task Handle(AlterarObservacaoDiarioBordoCommand request, CancellationToken cancellationToken)
{
var diarioBordoObservacao = await repositorioDiarioBordoObservacao.ObterPorIdAsync(request.ObservacaoId);
- var usuario = await mediator.Send(new ObterUsuarioLogadoQuery());
if (diarioBordoObservacao == null)
throw new NegocioException("Observação do diário de bordo não encontrada.");
@@ -38,6 +37,7 @@ public async Task Handle(AlterarObservacaoDiarioBordoCommand reque
await repositorioDiarioBordoObservacao.SalvarAsync(diarioBordoObservacao);
var notificacoes = await repositorioDiarioBordoObservacaoNotificacao.ObterPorDiarioBordoObservacaoId(request.ObservacaoId);
+ var usuario = await mediator.Send(new ObterUsuarioLogadoQuery());
if (request.Observacao.Trim().Length < 200 && (request.UsuariosIdNotificacao == null || !request.UsuariosIdNotificacao.Any()))
{
diff --git a/src/SME.SGP.Aplicacao/Commands/FilaRabbit/PublicarFilaSgp/PublicarFilaSgpCommandHandler.cs b/src/SME.SGP.Aplicacao/Commands/FilaRabbit/PublicarFilaSgp/PublicarFilaSgpCommandHandler.cs
index 5ef28bcfac..9e339efbd8 100644
--- a/src/SME.SGP.Aplicacao/Commands/FilaRabbit/PublicarFilaSgp/PublicarFilaSgpCommandHandler.cs
+++ b/src/SME.SGP.Aplicacao/Commands/FilaRabbit/PublicarFilaSgp/PublicarFilaSgpCommandHandler.cs
@@ -25,7 +25,7 @@ public async Task Handle(PublicarFilaSgpCommand command, CancellationToken
{
var usuario = command.Usuario ?? await ObtenhaUsuario();
- var administrador = await mediator.Send(new ObterAdministradorDoSuporteQuery());
+ var administrador = await mediator.Send(ObterAdministradorDoSuporteQuery.Instance);
var mensagem = new MensagemRabbit(command.Filtros,
command.CodigoCorrelacao,
diff --git a/src/SME.SGP.Aplicacao/Consultas/ConsultasProfessorTurma.cs b/src/SME.SGP.Aplicacao/Consultas/ConsultasProfessorTurma.cs
index d5e0790c25..442f990196 100644
--- a/src/SME.SGP.Aplicacao/Consultas/ConsultasProfessorTurma.cs
+++ b/src/SME.SGP.Aplicacao/Consultas/ConsultasProfessorTurma.cs
@@ -101,6 +101,11 @@ private async Task ObterProfessorUeRFEOL(string codigoRF, in
}
public async Task> ObterTurmasAtribuidasAoProfessorPorEscolaEAnoLetivo(string rfProfessor, string codigoEscola, int anoLetivo)
{
+ //Tem patterns mais interessantes para lidar com caches como ComputeIfAbsent por exemplo usando lazy delegates e genericos e formatos
+ // ex: var turmaDto = await cache.ObterAsync>(chave, () => funcaoquedeveserarmazenadaemcache, CacheEntryFormat.JSON);
+ // return turmaDto
+ //Outro caso utilizando patterns como decorators deixando a logica de cache envolta da chamada sem poluicao
+ //Ou ate mesmo usando dynamic proxies com diretive de cache especificas
IEnumerable turmasDto = null;
var chaveCache = $"Turmas-Professor-{rfProfessor}-ano-{anoLetivo}-escolal-{codigoEscola}";
var disciplinasCacheString = repositorioCache.Obter(chaveCache);
diff --git a/src/SME.SGP.Aplicacao/Integracoes/ServicoEOL.cs b/src/SME.SGP.Aplicacao/Integracoes/ServicoEOL.cs
index b2961b4680..6810977a54 100644
--- a/src/SME.SGP.Aplicacao/Integracoes/ServicoEOL.cs
+++ b/src/SME.SGP.Aplicacao/Integracoes/ServicoEOL.cs
@@ -11,8 +11,12 @@
using System.Linq;
using System.Net;
using System.Net.Http;
+using System.Net.Http.Json;
using System.Text;
+using System.Text.Json;
+using System.Text.Json.Serialization;
using System.Threading.Tasks;
+using JsonSerializer = System.Text.Json.JsonSerializer;
namespace SME.SGP.Aplicacao.Integracoes
{
@@ -20,6 +24,13 @@ public class ServicoEOL : IServicoEol
{
private readonly IMediator mediator;
private readonly HttpClient httpClient;
+ private readonly JsonSerializerOptions options = new JsonSerializerOptions
+ {
+ Converters =
+ {
+ new JsonStringEnumConverter()
+ }
+ };
public ServicoEOL(HttpClient httpClient, IMediator mediator)
{
@@ -29,11 +40,14 @@ public ServicoEOL(HttpClient httpClient, IMediator mediator)
public async Task AlterarEmail(string login, string email)
{
- var valoresParaEnvio = new List> {
- { new KeyValuePair("usuario", login) },
- { new KeyValuePair("email", email) }};
+ var valoresParaEnvio = new List>
+ {
+ {new KeyValuePair("usuario", login)},
+ {new KeyValuePair("email", email)}
+ };
- var resposta = await httpClient.PostAsync($"AutenticacaoSgp/AlterarEmail", new FormUrlEncodedContent(valoresParaEnvio));
+ var resposta = await httpClient.PostAsync($"AutenticacaoSgp/AlterarEmail",
+ new FormUrlEncodedContent(valoresParaEnvio));
if (resposta.IsSuccessStatusCode)
return;
@@ -45,16 +59,19 @@ public async Task AlterarEmail(string login, string email)
public async Task AlterarSenha(string login, string novaSenha)
{
- var valoresParaEnvio = new List> {
- { new KeyValuePair("usuario", login) },
- { new KeyValuePair("senha", novaSenha) }};
+ var valoresParaEnvio = new List>
+ {
+ {new KeyValuePair("usuario", login)},
+ {new KeyValuePair("senha", novaSenha)}
+ };
- var resposta = await httpClient.PostAsync($"AutenticacaoSgp/AlterarSenha", new FormUrlEncodedContent(valoresParaEnvio));
+ var resposta = await httpClient.PostAsync($"AutenticacaoSgp/AlterarSenha",
+ new FormUrlEncodedContent(valoresParaEnvio));
return new AlterarSenhaRespostaDto
{
Mensagem = resposta.IsSuccessStatusCode ? "" : await resposta.Content.ReadAsStringAsync(),
- StatusRetorno = (int)resposta.StatusCode,
+ StatusRetorno = (int) resposta.StatusCode,
SenhaAlterada = resposta.IsSuccessStatusCode
};
}
@@ -75,7 +92,8 @@ public async Task> ObterComponentesCurricul
public async Task TurmaPossuiComponenteCurricularPAP(string codigoTurma, string login, Guid idPerfil)
{
- var url = $"v1/componentes-curriculares/turmas/{codigoTurma}/funcionarios/{login}/perfis/{idPerfil}/validar/pap";
+ var url =
+ $"v1/componentes-curriculares/turmas/{codigoTurma}/funcionarios/{login}/perfis/{idPerfil}/validar/pap";
var resposta = await httpClient.GetAsync(url);
@@ -98,7 +116,8 @@ public async Task AtribuirCJSeNecessario(Guid usuarioId)
{
var parametros = JsonConvert.SerializeObject(usuarioId.ToString());
- var resposta = await httpClient.PostAsync("autenticacaoSgp/AtribuirPerfilCJ", new StringContent(parametros, Encoding.UTF8, "application/json-patch+json"));
+ var resposta = await httpClient.PostAsync("autenticacaoSgp/AtribuirPerfilCJ",
+ new StringContent(parametros, Encoding.UTF8, "application/json-patch+json"));
if (resposta.IsSuccessStatusCode)
return;
@@ -108,20 +127,19 @@ public async Task AtribuirCJSeNecessario(Guid usuarioId)
throw new NegocioException(mensagem);
}
- public async Task Autenticar(string login, string senha)
+ //O ideal pra esses tipo de casos é trabalhar com tipos opcionais. Optional, Either, Maybe..
+ //Retornar null para qualquer caso não deixa claro pro chamador que o valor pode vir nulo
+ //no caso de c# ainda tem o tipo Nullable (se ativar no compilador) que tem o mesmo efeito como no exemplo
+ public async Task Autenticar(string login, string senha)
{
- var parametros = JsonConvert.SerializeObject(new { login, senha });
- var resposta = await httpClient.PostAsync($"v1/autenticacao", new StringContent(parametros, Encoding.UTF8, "application/json-patch+json"));
-
+ var jsonContent = JsonContent.Create(new {login, senha});
+ var resposta = await httpClient.PostAsync($"v1/autenticacao", jsonContent);
if (resposta.IsSuccessStatusCode)
{
- var json = await resposta.Content.ReadAsStringAsync();
- return JsonConvert.DeserializeObject(json);
- }
- else
- {
- return null;
+ var contentStream = await resposta.Content.ReadAsStreamAsync();
+ return await JsonSerializer.DeserializeAsync(contentStream, options);
}
+ return null;
}
public IEnumerable BuscarCiclos()
@@ -165,6 +183,7 @@ public async Task ExisteUsuarioComMesmoEmail(string login, string email)
var json = await resposta.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject(json);
}
+
return false;
}
@@ -177,17 +196,21 @@ public async Task ObterAbrangencia(string login, Guid
var json = await resposta.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject(json);
}
+
return null;
}
- public async Task ObterAbrangenciaCompactaVigente(string login, Guid perfil)
+ public async Task ObterAbrangenciaCompactaVigente(string login,
+ Guid perfil)
{
- var resposta = await httpClient.GetAsync($"abrangencia/compacta-vigente/{login}/perfil/{perfil.ToString()}");
+ var resposta =
+ await httpClient.GetAsync($"abrangencia/compacta-vigente/{login}/perfil/{perfil.ToString()}");
if (resposta.IsSuccessStatusCode)
{
- var json = await resposta.Content.ReadAsStringAsync();
- return JsonConvert.DeserializeObject(json);
+ var contentStream = await resposta.Content.ReadAsStreamAsync();
+ return await JsonSerializer.DeserializeAsync(contentStream,
+ options);
}
return null;
@@ -216,6 +239,7 @@ public async Task ObterAdministradoresSGP(string codigoDreOuUe)
var json = await resposta.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject(json);
}
+
return null;
}
@@ -228,17 +252,21 @@ public async Task ObterAdministradoresSGPParaNotificar(string codigoDr
var json = await resposta.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject(json);
}
+
return null;
}
- public async Task> ObterAlunosPorNomeCodigoEol(string anoLetivo, string codigoUe, long codigoTurma, string nome, long? codigoEol, bool? somenteAtivos)
+ public async Task> ObterAlunosPorNomeCodigoEol(string anoLetivo,
+ string codigoUe, long codigoTurma, string nome, long? codigoEol, bool? somenteAtivos)
{
var alunos = new List();
var url = $"alunos/ues/{codigoUe}/anosLetivos/{anoLetivo}/autocomplete"
- + (codigoTurma > 0 ? $"?codigoTurma={codigoTurma}" : null)
- + (codigoEol.HasValue ? $"{(codigoTurma > 0 ? "&" : "?") + $"codigoEol={codigoEol}"}" : "")
- + (nome != null ? $"{(codigoEol != null || codigoTurma > 0 ? "&" : "?") + $"nomeAluno={nome}"}" : "")
- + (somenteAtivos == true ? $"&somenteAtivos={somenteAtivos}" : "");
+ + (codigoTurma > 0 ? $"?codigoTurma={codigoTurma}" : null)
+ + (codigoEol.HasValue ? $"{(codigoTurma > 0 ? "&" : "?") + $"codigoEol={codigoEol}"}" : "")
+ + (nome != null
+ ? $"{(codigoEol != null || codigoTurma > 0 ? "&" : "?") + $"nomeAluno={nome}"}"
+ : "")
+ + (somenteAtivos == true ? $"&somenteAtivos={somenteAtivos}" : "");
var resposta = await httpClient.GetAsync(url);
@@ -291,7 +319,8 @@ public async Task> ObterDisciplinasPorCodigoTurm
}
[Obsolete("Utilizar: ObterComponentesCurricularesPorCodigoTurmaLoginEPerfil", true)]
- public async Task> ObterDisciplinasPorCodigoTurmaLoginEPerfil(string codigoTurma, string login, Guid perfil)
+ public async Task> ObterDisciplinasPorCodigoTurmaLoginEPerfil(
+ string codigoTurma, string login, Guid perfil)
{
var url = $"funcionarios/{login}/perfis/{perfil}/turmas/{codigoTurma}/disciplinas";
@@ -307,7 +336,8 @@ public async Task> ObterComponentesRegencia
public async Task> ObterDisciplinasPorIdsSemAgrupamento(long[] ids)
{
var parametros = JsonConvert.SerializeObject(ids);
- var resposta = await httpClient.PostAsync("disciplinas/SemAgrupamento", new StringContent(parametros, Encoding.UTF8, "application/json-patch+json"));
+ var resposta = await httpClient.PostAsync("disciplinas/SemAgrupamento",
+ new StringContent(parametros, Encoding.UTF8, "application/json-patch+json"));
if (!resposta.IsSuccessStatusCode || resposta.StatusCode == HttpStatusCode.NoContent)
{
@@ -330,17 +360,22 @@ public IEnumerable ObterDres()
var json = resposta.Content.ReadAsStringAsync().Result;
return JsonConvert.DeserializeObject>(json);
}
+
return Enumerable.Empty();
}
public IEnumerable ObterEscolasPorCodigo(string[] codigoUes)
{
- var resposta = httpClient.PostAsync("escolas", new StringContent(JsonConvert.SerializeObject(codigoUes), Encoding.UTF8, "application/json-patch+json")).Result;
+ var resposta = httpClient.PostAsync("escolas",
+ new StringContent(JsonConvert.SerializeObject(codigoUes), Encoding.UTF8,
+ "application/json-patch+json"))
+ .Result;
if (resposta.IsSuccessStatusCode)
{
var json = resposta.Content.ReadAsStringAsync().Result;
return JsonConvert.DeserializeObject>(json);
}
+
return Enumerable.Empty();
}
@@ -352,6 +387,7 @@ public IEnumerable ObterEscolasPorDre(string dreId)
var json = resposta.Content.ReadAsStringAsync().Result;
return JsonConvert.DeserializeObject>(json);
}
+
return Enumerable.Empty();
}
@@ -378,8 +414,11 @@ public EstruturaInstitucionalRetornoEolDTO ObterEstruturaInstuticionalVigentePor
}
else
{
- _ = mediator.Send(new SalvarLogViaRabbitCommand($"Ocorreu um erro na tentativa de buscar os dados de Estrutura Institucional Vigente - HttpCode {resposta.StatusCode} - Body {resposta.Content?.ReadAsStringAsync()?.Result ?? string.Empty}", LogNivel.Negocio, LogContexto.ApiEol, string.Empty)).Result;
- throw new NegocioException($"Erro ao obter a estrutura organizacional vigente no EOL. URL base: {httpClient.BaseAddress}");
+ _ = mediator.Send(new SalvarLogViaRabbitCommand(
+ $"Ocorreu um erro na tentativa de buscar os dados de Estrutura Institucional Vigente - HttpCode {resposta.StatusCode} - Body {resposta.Content?.ReadAsStringAsync()?.Result ?? string.Empty}",
+ LogNivel.Negocio, LogContexto.ApiEol, string.Empty)).Result;
+ throw new NegocioException(
+ $"Erro ao obter a estrutura organizacional vigente no EOL. URL base: {httpClient.BaseAddress}");
}
}
}
@@ -387,9 +426,11 @@ public EstruturaInstitucionalRetornoEolDTO ObterEstruturaInstuticionalVigentePor
return resultado;
}
- public EstruturaInstitucionalRetornoEolDTO ObterEstruturaInstuticionalVigentePorTurma(string[] codigosTurma = null)
+ public EstruturaInstitucionalRetornoEolDTO ObterEstruturaInstuticionalVigentePorTurma(
+ string[] codigosTurma = null)
{
- var filtroTurmas = new StringContent(JsonConvert.SerializeObject(codigosTurma ?? new string[] { }), UnicodeEncoding.UTF8, "application/json");
+ var filtroTurmas = new StringContent(JsonConvert.SerializeObject(codigosTurma ?? new string[] { }),
+ UnicodeEncoding.UTF8, "application/json");
string url = $"abrangencia/estrutura-vigente";
@@ -402,12 +443,14 @@ public EstruturaInstitucionalRetornoEolDTO ObterEstruturaInstuticionalVigentePor
}
else
{
- _ = mediator.Send(new SalvarLogViaRabbitCommand($"Ocorreu um erro na tentativa de buscar os dados de Estrutura Institucional Vigente - HttpCode {resposta.StatusCode} - Body {resposta.Content?.ReadAsStringAsync()?.Result ?? string.Empty}", LogNivel.Negocio, LogContexto.ApiEol, string.Empty)).Result;
+ _ = mediator.Send(new SalvarLogViaRabbitCommand(
+ $"Ocorreu um erro na tentativa de buscar os dados de Estrutura Institucional Vigente - HttpCode {resposta.StatusCode} - Body {resposta.Content?.ReadAsStringAsync()?.Result ?? string.Empty}",
+ LogNivel.Negocio, LogContexto.ApiEol, string.Empty)).Result;
return null;
}
}
-
+
public async Task> ObterFuncionariosPorCargoUeAsync(string ueId, long cargoId)
{
var resposta = await httpClient.GetAsync($"escolas/{ueId}/funcionarios/cargos/{cargoId}");
@@ -416,12 +459,15 @@ public async Task> ObterFuncionariosPorCargoUe
var json = resposta.Content.ReadAsStringAsync().Result;
return JsonConvert.DeserializeObject>(json);
}
+
return Enumerable.Empty();
}
- public async Task> ObterFuncionariosPorUe(BuscaFuncionariosFiltroDto buscaFuncionariosFiltroDto)
+ public async Task> ObterFuncionariosPorUe(
+ BuscaFuncionariosFiltroDto buscaFuncionariosFiltroDto)
{
- var jsonParaPost = new StringContent(JsonConvert.SerializeObject(buscaFuncionariosFiltroDto), UnicodeEncoding.UTF8, "application/json");
+ var jsonParaPost = new StringContent(JsonConvert.SerializeObject(buscaFuncionariosFiltroDto),
+ UnicodeEncoding.UTF8, "application/json");
var resposta = await httpClient.PostAsync("funcionarios/", jsonParaPost);
@@ -438,7 +484,7 @@ public async Task> ObterListaNomePorListaRF(IEnu
{
var resposta = await httpClient.PostAsync($"funcionarios/BuscarPorListaRF",
new StringContent(JsonConvert.SerializeObject(codigosRF),
- Encoding.UTF8, "application/json-patch+json"));
+ Encoding.UTF8, "application/json-patch+json"));
if (!resposta.IsSuccessStatusCode)
return null;
@@ -451,11 +497,12 @@ public async Task> ObterListaNomePorListaRF(IEnu
return JsonConvert.DeserializeObject>(json);
}
- public async Task> ObterListaResumosPorListaRF(IEnumerable codigosRF, int anoLetivo)
+ public async Task> ObterListaResumosPorListaRF(IEnumerable codigosRF,
+ int anoLetivo)
{
var resposta = await httpClient.PostAsync($"professores/{anoLetivo}/BuscarPorListaRF",
new StringContent(JsonConvert.SerializeObject(codigosRF),
- Encoding.UTF8, "application/json-patch+json"));
+ Encoding.UTF8, "application/json-patch+json"));
if (!resposta.IsSuccessStatusCode)
return null;
@@ -476,6 +523,7 @@ public IEnumerable ObterListaTurmasPorProfessor(string co
var json = resposta.Content.ReadAsStringAsync().Result;
return JsonConvert.DeserializeObject>(json);
}
+
return Enumerable.Empty();
}
@@ -484,46 +532,62 @@ public async Task ObterMeusDados(string login)
var url = $"AutenticacaoSgp/{login}/dados";
var resposta = await httpClient.GetAsync(url);
- if (!resposta.IsSuccessStatusCode)
+ if (resposta.IsSuccessStatusCode)
{
- await RegistrarLogAsync(resposta, "ObterMeusDados", "login = " + login);
- throw new NegocioException("Não foi possível obter os dados do usuário");
+ var contentStream = await resposta.Content.ReadAsStreamAsync();
+ return await JsonSerializer.DeserializeAsync(contentStream);
}
- var json = await resposta.Content.ReadAsStringAsync();
- return JsonConvert.DeserializeObject(json);
+
+ await RegistrarLogAsync(resposta, "ObterMeusDados", "login = " + login);
+ throw new NegocioException("Não foi possível obter os dados do usuário");
}
- public async Task ObterPerfisPorLogin(string login)
+ public async Task ObterPerfisPorLogin(string login)
{
var resposta = await httpClient.GetAsync($"autenticacaoSgp/CarregarPerfisPorLogin/{login}");
if (resposta.IsSuccessStatusCode)
{
- var json = await resposta.Content.ReadAsStringAsync();
- return JsonConvert.DeserializeObject(json);
+ var contentStream = await resposta.Content.ReadAsStreamAsync();
+ return await JsonSerializer.DeserializeAsync(contentStream);
}
+
+ //o ideal é ja falhar aqui a tentativa de carregar o perfil, pelo que vi o tratamento
+ //está propagando pra tudo que é chamador e nao tem nada que indique para o chamador que isso
+ //pode retornar null
return null;
}
- public async Task CarregarDadosAcessoPorLoginPerfil(string login, Guid perfilGuid, AdministradorSuporteDto administradorSuporte = null)
+ public async Task CarregarDadosAcessoPorLoginPerfil(string login,
+ Guid perfilGuid, AdministradorSuporteDto administradorSuporte = null)
{
- HttpResponseMessage resposta;
-
- if (administradorSuporte != null)
- resposta = await httpClient.GetAsync($"AutenticacaoSgp/CarregarDadosAcesso/usuarios/{login}/perfis/{perfilGuid}?loginAdm={administradorSuporte.Login}&nomeAdm={administradorSuporte.Nome}");
- else
- resposta = await httpClient.GetAsync($"AutenticacaoSgp/CarregarDadosAcesso/usuarios/{login}/perfis/{perfilGuid}");
-
- if (!resposta.IsSuccessStatusCode)
- return null;
-
- var json = await resposta.Content.ReadAsStringAsync();
- return JsonConvert.DeserializeObject(json);
+ var uri = administradorSuporte is null
+ ? $"AutenticacaoSgp/CarregarDadosAcesso/usuarios/{login}/perfis/{perfilGuid}"
+ : $"AutenticacaoSgp/CarregarDadosAcesso/usuarios/{login}/perfis/{perfilGuid}?loginAdm={administradorSuporte.Login}&nomeAdm={administradorSuporte.Nome}";
+
+ var resposta = await httpClient.GetAsync(uri);
+
+ if (resposta.IsSuccessStatusCode)
+ {
+ //pelo profile de memoria esta alocando gigas de memoria para trabalhar com string
+ //e depois converter para objeto, o ideal é usar implementacoes mais modernas
+ //que usam stream e fazem pouca alocacao de memoria na heap
+ var contentStream = await resposta.Content.ReadAsStreamAsync();
+ return await JsonSerializer.DeserializeAsync(contentStream);
+ }
+
+ //nao tem nada que indique para o chamador que isso
+ //pode retornar null, o ideal é lancar uma exceção caso nao consiga carregar os dados de perfil
+ //ou outra estrategia para continuar logando.
+ return null;
}
- public async Task> ObterProfessoresAutoComplete(int anoLetivo, string dreId, string ueId, string nomeProfessor)
+ public async Task> ObterProfessoresAutoComplete(int anoLetivo, string dreId,
+ string ueId, string nomeProfessor)
{
- var resposta = await httpClient.GetAsync($"professores/{anoLetivo}/AutoComplete/{dreId}?nome={nomeProfessor}&ueId={ueId}");
+ var resposta =
+ await httpClient.GetAsync(
+ $"professores/{anoLetivo}/AutoComplete/{dreId}?nome={nomeProfessor}&ueId={ueId}");
if (!resposta.IsSuccessStatusCode)
return null;
@@ -534,9 +598,12 @@ public async Task> ObterProfessoresAutoComplete(
return JsonConvert.DeserializeObject>(json);
}
- public async Task> ObterProfessoresAutoComplete(int anoLetivo, string dreId, string nomeProfessor, bool incluirEmei)
+ public async Task> ObterProfessoresAutoComplete(int anoLetivo, string dreId,
+ string nomeProfessor, bool incluirEmei)
{
- var resposta = await httpClient.GetAsync($"professores/{anoLetivo}/AutoComplete/{dreId}/{incluirEmei}?nome={nomeProfessor}");
+ var resposta =
+ await httpClient.GetAsync(
+ $"professores/{anoLetivo}/AutoComplete/{dreId}/{incluirEmei}?nome={nomeProfessor}");
if (!resposta.IsSuccessStatusCode)
return null;
@@ -548,7 +615,8 @@ public async Task> ObterProfessoresAutoComplete(
return JsonConvert.DeserializeObject>(json);
}
- public async Task> ObterProfessoresTitularesPorTurmas(IEnumerable codigosTurmas)
+ public async Task> ObterProfessoresTitularesPorTurmas(
+ IEnumerable codigosTurmas)
{
StringBuilder url = new StringBuilder();
@@ -564,7 +632,7 @@ public async Task> ObterProfessoresTi
var json = await resposta.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject>(json);
}
-
+
public async Task ObterNomeProfessorPeloRF(string rfProfessor)
{
StringBuilder url = new StringBuilder();
@@ -598,9 +666,12 @@ public async Task ObterResumoCore(string login)
return JsonConvert.DeserializeObject(json);
}
- public async Task ObterResumoProfessorPorRFAnoLetivo(string codigoRF, int anoLetivo, bool buscarOutrosCargos = false)
+ public async Task ObterResumoProfessorPorRFAnoLetivo(string codigoRF, int anoLetivo,
+ bool buscarOutrosCargos = false)
{
- var resposta = await httpClient.GetAsync($"professores/{codigoRF}/BuscarPorRf/{anoLetivo}?buscarOutrosCargos={buscarOutrosCargos}");
+ var resposta =
+ await httpClient.GetAsync(
+ $"professores/{codigoRF}/BuscarPorRf/{anoLetivo}?buscarOutrosCargos={buscarOutrosCargos}");
if (!resposta.IsSuccessStatusCode)
throw new NegocioException("Ocorreu uma falha ao consultar o professor");
@@ -615,7 +686,8 @@ public async Task ObterResumoProfessorPorRFAnoLetivo(string
public async Task ObterProfessorPorRFUeDreAnoLetivo(string codigoRF, int anoLetivo, string dreId, string ueId, bool buscarOutrosCargos = false, bool buscarPorTodasDre = false)
{
- if (string.IsNullOrWhiteSpace(codigoRF) || anoLetivo == 0 || (!buscarPorTodasDre && (string.IsNullOrWhiteSpace(dreId) || string.IsNullOrWhiteSpace(ueId))))
+ if (string.IsNullOrWhiteSpace(codigoRF) || anoLetivo == 0 || (!buscarPorTodasDre && (string.IsNullOrWhiteSpace(dreId) ||
+ string.IsNullOrWhiteSpace(ueId))))
throw new NegocioException("É necessario informar o codigoRF Dre, UE e o ano letivo");
string paramUeId = string.Empty, paramDreId = string.Empty;
@@ -697,12 +769,15 @@ public async Task ObterProfessorPorRFUeDreAnoLetivo(string c
public IEnumerable ObterSupervisoresPorCodigo(string[] codigoSupervisores)
{
- var resposta = httpClient.PostAsync("funcionarios/supervisores", new StringContent(JsonConvert.SerializeObject(codigoSupervisores), Encoding.UTF8, "application/json-patch+json")).Result;
+ var resposta = httpClient.PostAsync("funcionarios/supervisores",
+ new StringContent(JsonConvert.SerializeObject(codigoSupervisores), Encoding.UTF8,
+ "application/json-patch+json")).Result;
if (resposta.IsSuccessStatusCode)
{
var json = resposta.Content.ReadAsStringAsync().Result;
return JsonConvert.DeserializeObject>(json);
}
+
return Enumerable.Empty();
}
@@ -714,22 +789,28 @@ public IEnumerable ObterSupervisoresPorDre(string dreId)
var json = resposta.Content.ReadAsStringAsync().Result;
return JsonConvert.DeserializeObject>(json);
}
+
return Enumerable.Empty();
}
- public async Task> ObterTurmasAtribuidasAoProfessorPorEscolaEAnoLetivo(string rfProfessor, string codigoEscola, int anoLetivo)
+ public async Task> ObterTurmasAtribuidasAoProfessorPorEscolaEAnoLetivo(string rfProfessor,
+ string codigoEscola, int anoLetivo)
{
- var resposta = await httpClient.GetAsync($"professores/{rfProfessor}/escolas/{codigoEscola}/turmas/anos_letivos/{anoLetivo}");
+ var resposta =
+ await httpClient.GetAsync(
+ $"professores/{rfProfessor}/escolas/{codigoEscola}/turmas/anos_letivos/{anoLetivo}");
if (resposta.IsSuccessStatusCode)
{
var json = await resposta.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject>(json);
}
+
return null;
}
- public async Task> ObterTurmasParaCopiaPlanoAnual(string codigoRf, long componenteCurricularId, int codigoTurma)
+ public async Task> ObterTurmasParaCopiaPlanoAnual(string codigoRf,
+ long componenteCurricularId, int codigoTurma)
{
var parametros = JsonConvert.SerializeObject(new
{
@@ -738,13 +819,15 @@ public async Task> ObterTurmasParaCopia
codigoTurma
});
- var resposta = await httpClient.PostAsync($"funcionarios/BuscarTurmasElegiveis", new StringContent(parametros, Encoding.UTF8, "application/json-patch+json"));
+ var resposta = await httpClient.PostAsync($"funcionarios/BuscarTurmasElegiveis",
+ new StringContent(parametros, Encoding.UTF8, "application/json-patch+json"));
var turmas = new List();
if (resposta.IsSuccessStatusCode)
{
var json = await resposta.Content.ReadAsStringAsync();
turmas = JsonConvert.DeserializeObject>(json);
}
+
return turmas;
}
@@ -757,6 +840,7 @@ public async Task> ObterTurmasPorUE(string ueId,
var json = resposta.Content.ReadAsStringAsync().Result;
turmas = JsonConvert.DeserializeObject>(json);
}
+
return turmas;
}
@@ -764,7 +848,8 @@ public async Task PodePersistirTurma(string professorRf, string codigoTurm
{
var dataString = data.ToString("s");
- var resposta = await httpClient.GetAsync($"professores/{professorRf}/turmas/{codigoTurma}/atribuicao/verificar/data?dataConsulta={dataString}");
+ var resposta = await httpClient.GetAsync(
+ $"professores/{professorRf}/turmas/{codigoTurma}/atribuicao/verificar/data?dataConsulta={dataString}");
if (!resposta.IsSuccessStatusCode)
throw new NegocioException("Não foi possível validar a atribuição do professor no EOL.");
@@ -773,11 +858,13 @@ public async Task PodePersistirTurma(string professorRf, string codigoTurm
return JsonConvert.DeserializeObject(json);
}
- public async Task PodePersistirTurmaDisciplina(string professorRf, string codigoTurma, string disciplinaId, DateTime data)
+ public async Task PodePersistirTurmaDisciplina(string professorRf, string codigoTurma,
+ string disciplinaId, DateTime data)
{
var dataString = data.ToString("s");
- var resposta = await httpClient.GetAsync($"professores/{professorRf}/turmas/{codigoTurma}/disciplinas/{disciplinaId}/atribuicao/verificar/data?={dataString}");
+ var resposta = await httpClient.GetAsync(
+ $"professores/{professorRf}/turmas/{codigoTurma}/disciplinas/{disciplinaId}/atribuicao/verificar/data?={dataString}");
if (!resposta.IsSuccessStatusCode)
throw new NegocioException("Não foi possível validar a atribuição do professor no EOL.");
@@ -786,9 +873,11 @@ public async Task PodePersistirTurmaDisciplina(string professorRf, string
return JsonConvert.DeserializeObject(json);
}
- public async Task VerificaAtribuicaoProfessorTurma(string professorRf, string codigoTurma)
+ public async Task VerificaAtribuicaoProfessorTurma(string professorRf,
+ string codigoTurma)
{
- var resposta = await httpClient.GetAsync($"professores/{professorRf}/turmas/{codigoTurma}/atribuicao/status");
+ var resposta =
+ await httpClient.GetAsync($"professores/{professorRf}/turmas/{codigoTurma}/atribuicao/status");
if (resposta.IsSuccessStatusCode)
{
var json = resposta.Content.ReadAsStringAsync().Result;
@@ -802,10 +891,13 @@ public async Task VerificaAtribuicaoProfessorTur
public async Task ReiniciarSenha(string login)
{
- IList> valoresParaEnvio = new List> {
- { new KeyValuePair("login", login) }};
+ IList> valoresParaEnvio = new List>
+ {
+ {new KeyValuePair("login", login)}
+ };
- var resposta = await httpClient.PostAsync($"AutenticacaoSgp/ReiniciarSenha", new FormUrlEncodedContent(valoresParaEnvio));
+ var resposta = await httpClient.PostAsync($"AutenticacaoSgp/ReiniciarSenha",
+ new FormUrlEncodedContent(valoresParaEnvio));
if (!resposta.IsSuccessStatusCode)
throw new NegocioException("Não foi possível reiniciar a senha deste usuário");
@@ -813,10 +905,13 @@ public async Task ReiniciarSenha(string login)
public async Task RelecionarUsuarioPerfis(string login)
{
- IList> valoresParaEnvio = new List> {
- { new KeyValuePair("login", login) }};
+ IList> valoresParaEnvio = new List>
+ {
+ {new KeyValuePair("login", login)}
+ };
- var resposta = await httpClient.PostAsync($"AutenticacaoSgp/RelacionarUsuarioPerfis", new FormUrlEncodedContent(valoresParaEnvio));
+ var resposta = await httpClient.PostAsync($"AutenticacaoSgp/RelacionarUsuarioPerfis",
+ new FormUrlEncodedContent(valoresParaEnvio));
if (resposta.IsSuccessStatusCode)
{
@@ -833,7 +928,8 @@ public async Task RemoverCJSeNecessario(Guid usuarioId)
{
var parametros = JsonConvert.SerializeObject(usuarioId.ToString());
- var resposta = await httpClient.PostAsync("autenticacaoSgp/RemoverPerfilCJ", new StringContent(parametros, Encoding.UTF8, "application/json-patch+json"));
+ var resposta = await httpClient.PostAsync("autenticacaoSgp/RemoverPerfilCJ",
+ new StringContent(parametros, Encoding.UTF8, "application/json-patch+json"));
if (resposta.IsSuccessStatusCode)
return;
@@ -852,6 +948,7 @@ public async Task ValidarProfessor(string professorRf)
var json = await resposta.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject(json);
}
+
return false;
}
@@ -889,8 +986,11 @@ private string[] ObterCodigosDres()
}
else
{
- _ = mediator.Send(new SalvarLogViaRabbitCommand($"Ocorreu um erro na tentativa de buscar os codigos das Dres no EOL - HttpCode {resposta.StatusCode} - Body {resposta.Content?.ReadAsStringAsync()?.Result ?? string.Empty} - URL: {httpClient.BaseAddress}", LogNivel.Negocio, LogContexto.ApiEol, string.Empty)).Result;
- throw new NegocioException($"Erro ao obter os códigos de DREs no EOL. URL base: {httpClient.BaseAddress}");
+ _ = mediator.Send(new SalvarLogViaRabbitCommand(
+ $"Ocorreu um erro na tentativa de buscar os codigos das Dres no EOL - HttpCode {resposta.StatusCode} - Body {resposta.Content?.ReadAsStringAsync()?.Result ?? string.Empty} - URL: {httpClient.BaseAddress}",
+ LogNivel.Negocio, LogContexto.ApiEol, string.Empty)).Result;
+ throw new NegocioException(
+ $"Erro ao obter os códigos de DREs no EOL. URL base: {httpClient.BaseAddress}");
}
}
@@ -936,7 +1036,9 @@ private void RegistrarLog(HttpResponseMessage resposta, string rotina, string pa
if (resposta.StatusCode != HttpStatusCode.NotFound)
{
var mensagem = resposta.Content.ReadAsStringAsync().Result;
- _ = mediator.Send(new SalvarLogViaRabbitCommand($"Ocorreu um erro ao {rotina} no EOL, código de erro: {resposta.StatusCode}, mensagem: {mensagem ?? "Sem mensagem"},Parametros:{parametros}, Request: {JsonConvert.SerializeObject(resposta.RequestMessage)}, ", LogNivel.Negocio, LogContexto.ApiEol, string.Empty)).Result;
+ _ = mediator.Send(new SalvarLogViaRabbitCommand(
+ $"Ocorreu um erro ao {rotina} no EOL, código de erro: {resposta.StatusCode}, mensagem: {mensagem ?? "Sem mensagem"},Parametros:{parametros}, Request: {JsonConvert.SerializeObject(resposta.RequestMessage)}, ",
+ LogNivel.Negocio, LogContexto.ApiEol, string.Empty)).Result;
}
}
@@ -945,25 +1047,32 @@ private async Task RegistrarLogAsync(HttpResponseMessage resposta, string rotina
if (resposta.StatusCode != HttpStatusCode.NotFound)
{
var mensagem = await resposta.Content.ReadAsStringAsync();
- await mediator.Send(new SalvarLogViaRabbitCommand($"Ocorreu um erro ao {rotina} no EOL, código de erro: {resposta.StatusCode}, mensagem: {mensagem ?? "Sem mensagem"},Parametros:{parametros}, Request: {JsonConvert.SerializeObject(resposta.RequestMessage)}, ", LogNivel.Negocio, LogContexto.ApiEol, string.Empty));
+ await mediator.Send(new SalvarLogViaRabbitCommand(
+ $"Ocorreu um erro ao {rotina} no EOL, código de erro: {resposta.StatusCode}, mensagem: {mensagem ?? "Sem mensagem"},Parametros:{parametros}, Request: {JsonConvert.SerializeObject(resposta.RequestMessage)}, ",
+ LogNivel.Negocio, LogContexto.ApiEol, string.Empty));
}
}
- public async Task> ObterFuncionariosPorDre(Guid perfil, FiltroFuncionarioDto filtroFuncionariosDto)
+ public async Task> ObterFuncionariosPorDre(Guid perfil,
+ FiltroFuncionarioDto filtroFuncionariosDto)
{
- var resposta = await httpClient.GetAsync($@"funcionarios/perfis/{perfil}/dres/{filtroFuncionariosDto.CodigoDRE}?CodigoUe={filtroFuncionariosDto.CodigoUE}&CodigoRf={filtroFuncionariosDto.CodigoRF}&NomeServidor={filtroFuncionariosDto.NomeServidor}");
+ var resposta = await httpClient.GetAsync(
+ $@"funcionarios/perfis/{perfil}/dres/{filtroFuncionariosDto.CodigoDRE}?CodigoUe={filtroFuncionariosDto.CodigoUE}&CodigoRf={filtroFuncionariosDto.CodigoRF}&NomeServidor={filtroFuncionariosDto.NomeServidor}");
if (resposta.IsSuccessStatusCode)
{
var json = await resposta.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject>(json);
}
+
return Enumerable.Empty();
}
- public async Task> ObterComponentesCurricularesPorAnosEModalidade(string codigoUe, Modalidade modalidade, string[] anosEscolares, int anoLetivo)
+ public async Task> ObterComponentesCurricularesPorAnosEModalidade(
+ string codigoUe, Modalidade modalidade, string[] anosEscolares, int anoLetivo)
{
- var url = $@"v1/componentes-curriculares/ues/{codigoUe}/modalidades/{(int)modalidade}/anos/{anoLetivo}/anos-escolares?anosEscolares={string.Join("&anosEscolares=", anosEscolares)}";
+ var url =
+ $@"v1/componentes-curriculares/ues/{codigoUe}/modalidades/{(int) modalidade}/anos/{anoLetivo}/anos-escolares?anosEscolares={string.Join("&anosEscolares=", anosEscolares)}";
var resposta = await httpClient.GetAsync(url);
@@ -972,10 +1081,13 @@ public async Task> ObterComponentesCurricul
var json = await resposta.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject>(json);
}
+
return Enumerable.Empty();
}
- public async Task> ObterComponentesCurricularesTurmasProgramaPorAnoEModalidade(string codigoUe, Modalidade modalidade, int anoLetivo)
+ public async Task>
+ ObterComponentesCurricularesTurmasProgramaPorAnoEModalidade(string codigoUe, Modalidade modalidade,
+ int anoLetivo)
{
var url = $@"v1/componentes-curriculares/ues/{codigoUe}/modalidades/{modalidade}/anos/{anoLetivo}";
@@ -986,6 +1098,7 @@ public async Task> ObterComponentesCurricul
var json = await resposta.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject>(json);
}
+
return Enumerable.Empty();
}
@@ -1001,12 +1114,15 @@ public async Task AtribuirPerfil(string codigoRf, Guid perfil)
throw new NegocioException(mensagem);
}
- public async Task PodePersistirTurmaNoPeriodo(string professorRf, string codigoTurma, long componenteCurricularId, DateTime dataInicio, DateTime dataFim)
+ public async Task PodePersistirTurmaNoPeriodo(string professorRf, string codigoTurma,
+ long componenteCurricularId, DateTime dataInicio, DateTime dataFim)
{
var dataInicioString = dataInicio.ToString("s");
var dataFimString = dataFim.ToString("s");
- var resposta = await httpClient.PostAsync($"professores/{professorRf}/turmas/{codigoTurma}/componentes/{componenteCurricularId}/atribuicao/periodo/inicio/{dataInicioString}/fim/{dataFimString}", new StringContent(""));
+ var resposta = await httpClient.PostAsync(
+ $"professores/{professorRf}/turmas/{codigoTurma}/componentes/{componenteCurricularId}/atribuicao/periodo/inicio/{dataInicioString}/fim/{dataFimString}",
+ new StringContent(""));
if (!resposta.IsSuccessStatusCode)
throw new NegocioException("Não foi possível validar a atribuição do professor no EOL.");
@@ -1022,7 +1138,8 @@ public async Task> ObterDisciplinasPorIdsAgrupadas(lo
var url = @"disciplinas/turma/";
if (codigoTurma != null)
url += $"?codigoTurma={codigoTurma}";
- var resposta = await httpClient.PostAsync(url, new StringContent(parametros, Encoding.UTF8, "application/json-patch+json"));
+ var resposta = await httpClient.PostAsync(url,
+ new StringContent(parametros, Encoding.UTF8, "application/json-patch+json"));
if (!resposta.IsSuccessStatusCode || resposta.StatusCode == HttpStatusCode.NoContent)
{
@@ -1053,7 +1170,8 @@ public async Task ObterNecessidadesEspeciaisAluno(
public async Task> DefinirTurmasRegulares(string[] codigosTurmas)
{
var parametros = JsonConvert.SerializeObject(codigosTurmas);
- var resposta = await httpClient.PostAsync("turmas/turmas-regulares", new StringContent(parametros, Encoding.UTF8, "application/json-patch+json"));
+ var resposta = await httpClient.PostAsync("turmas/turmas-regulares",
+ new StringContent(parametros, Encoding.UTF8, "application/json-patch+json"));
if (!resposta.IsSuccessStatusCode || resposta.StatusCode == HttpStatusCode.NoContent)
{
@@ -1065,10 +1183,13 @@ public async Task> DefinirTurmasRegulares(string[] codigosTu
return JsonConvert.DeserializeObject>(json);
}
-
- public async Task> ListagemTurmasComComponente(string codigoUe, string modalidade, int bimestre, string codigoTurma, int anoLetivo, int qtdeRegistros, int qtdeRegistrosIgnorados)
+
+ public async Task> ListagemTurmasComComponente(
+ string codigoUe, string modalidade, int bimestre, string codigoTurma, int anoLetivo, int qtdeRegistros,
+ int qtdeRegistrosIgnorados)
{
- var url = $@"turmas/{codigoUe}/{modalidade}/{bimestre}/{codigoTurma}/{anoLetivo}/{qtdeRegistros}/{qtdeRegistrosIgnorados}/listagem-turmas";
+ var url =
+ $@"turmas/{codigoUe}/{modalidade}/{bimestre}/{codigoTurma}/{anoLetivo}/{qtdeRegistros}/{qtdeRegistrosIgnorados}/listagem-turmas";
var resposta = await httpClient.GetAsync(url);
@@ -1076,10 +1197,12 @@ public async Task>(json);
+ return JsonConvert
+ .DeserializeObject>(json);
}
- public async Task> ObterProfessoresTitularesPorUe(string ueCodigo, DateTime dataReferencia)
+ public async Task> ObterProfessoresTitularesPorUe(string ueCodigo,
+ DateTime dataReferencia)
{
var url = $"professores/titulares/ue/{ueCodigo}/{dataReferencia.ToString("yyyy-MM-dd")}";
var resposta = await httpClient.GetAsync(url);
@@ -1124,16 +1247,18 @@ public async Task ObtenhaAutenticacaoSemSenha(string logi
return JsonConvert.DeserializeObject(json);
}
- public async Task> ObterUsuarioFuncionario(Guid perfil, FiltroFuncionarioDto filtroFuncionariosDto)
+ public async Task> ObterUsuarioFuncionario(Guid perfil,
+ FiltroFuncionarioDto filtroFuncionariosDto)
{
- var resposta = await httpClient.GetAsync($@"funcionarios/perfis/{perfil}?CodigoDre={filtroFuncionariosDto.CodigoDRE}&CodigoUe={filtroFuncionariosDto.CodigoUE}&CodigoRf={filtroFuncionariosDto.CodigoRF}&NomeServidor={filtroFuncionariosDto.NomeServidor}");
+ var resposta = await httpClient.GetAsync(
+ $@"funcionarios/perfis/{perfil}?CodigoDre={filtroFuncionariosDto.CodigoDRE}&CodigoUe={filtroFuncionariosDto.CodigoUE}&CodigoRf={filtroFuncionariosDto.CodigoRF}&NomeServidor={filtroFuncionariosDto.NomeServidor}");
if (resposta.IsSuccessStatusCode)
{
var json = await resposta.Content.ReadAsStringAsync();
return JsonConvert.DeserializeObject>(json);
-
}
+
return Enumerable.Empty();
}
}
diff --git a/src/SME.SGP.Aplicacao/Integracoes/ServicoEOL.cs.rej b/src/SME.SGP.Aplicacao/Integracoes/ServicoEOL.cs.rej
new file mode 100644
index 0000000000..419c992e60
--- /dev/null
+++ b/src/SME.SGP.Aplicacao/Integracoes/ServicoEOL.cs.rej
@@ -0,0 +1,48 @@
+diff a/src/SME.SGP.Aplicacao/Integracoes/ServicoEOL.cs b/src/SME.SGP.Aplicacao/Integracoes/ServicoEOL.cs (rejected hunks)
+@@ -258,23 +286,29 @@ namespace SME.SGP.Aplicacao.Integracoes
+ return await mediator.Send(new ObterComponentesCurricularesEolPorCodigoTurmaLoginEPerfilQuery(codigoTurma, login, perfil, realizarAgrupamentoComponente, checaMotivoDisponibilizacao));
+ }
+
+- public async Task> ObterComponentesCurricularesPorLoginEIdPerfil(string login, Guid idPerfil)
++ public async Task> ObterComponentesCurricularesPorLoginEIdPerfil(
++ string login, Guid idPerfil)
+ {
+ var url = $"v1/componentes-curriculares/funcionarios/{login}/perfis/{idPerfil}";
+ return await ObterComponentesCurriculares(url);
+ }
+
+- public async Task> ObterComponentesCurricularesPorCodigoTurmaLoginEPerfilParaPlanejamento(string codigoTurma, string login, Guid perfil)
++ public async Task>
++ ObterComponentesCurricularesPorCodigoTurmaLoginEPerfilParaPlanejamento(string codigoTurma, string login,
++ Guid perfil)
+ {
+- var url = $"v1/componentes-curriculares/turmas/{codigoTurma}/funcionarios/{login}/perfis/{perfil}/planejamento";
++ var url =
++ $"v1/componentes-curriculares/turmas/{codigoTurma}/funcionarios/{login}/perfis/{perfil}/planejamento";
+ return await ObterComponentesCurriculares(url);
+ }
+
+- public async Task> ObterDadosAluno(string codigoAluno, int anoLetivo, bool consideraHistorico, bool filtrarSituacao = true)
++ public async Task> ObterDadosAluno(string codigoAluno, int anoLetivo,
++ bool consideraHistorico, bool filtrarSituacao = true)
+ {
+ var alunos = new List();
+
+- var resposta = await httpClient.GetAsync($"alunos/{codigoAluno}/turmas/anosLetivos/{anoLetivo}/historico/{consideraHistorico}/filtrar-situacao/{filtrarSituacao}");
++ var resposta = await httpClient.GetAsync(
++ $"alunos/{codigoAluno}/turmas/anosLetivos/{anoLetivo}/historico/{consideraHistorico}/filtrar-situacao/{filtrarSituacao}");
+ if (resposta.IsSuccessStatusCode)
+ {
+ var json = await resposta.Content.ReadAsStringAsync();
+@@ -845,7 +948,10 @@ namespace SME.SGP.Aplicacao.Integracoes
+ {
+ return disciplinas.Select(x => new DisciplinaDto
+ {
+- CodigoComponenteCurricular = !x.Territorio? x.CdComponenteCurricular : long.Parse(x.CdComponenteCurricular.ToString().Substring(x.CdComponenteCurricular.ToString().Length - 4)),
++ CodigoComponenteCurricular = !x.Territorio
++ ? x.CdComponenteCurricular
++ : long.Parse(x.CdComponenteCurricular.ToString()
++ .Substring(x.CdComponenteCurricular.ToString().Length - 4)),
+ Nome = x.Descricao,
+ Regencia = x.EhRegencia,
+ Compartilhada = x.EhCompartilhada,
diff --git a/src/SME.SGP.Aplicacao/Interfaces/Comandos/IComandosUsuario.cs.rej b/src/SME.SGP.Aplicacao/Interfaces/Comandos/IComandosUsuario.cs.rej
new file mode 100644
index 0000000000..fa7d8867ac
--- /dev/null
+++ b/src/SME.SGP.Aplicacao/Interfaces/Comandos/IComandosUsuario.cs.rej
@@ -0,0 +1,14 @@
+diff a/src/SME.SGP.Aplicacao/Interfaces/Comandos/IComandosUsuario.cs b/src/SME.SGP.Aplicacao/Interfaces/Comandos/IComandosUsuario.cs (rejected hunks)
+@@ -33,8 +33,10 @@ namespace SME.SGP.Aplicacao
+
+ Task AutenticarSuporte(string login);
+
++ //sugestao de nomear tuplas se for manter ou trocar para records ou tipos de estrutura mais flexiveis
++ //que encapsulem o retorno
+ Task ObterAutenticacao(
+- (UsuarioAutenticacaoRetornoDto, string, IEnumerable, bool, bool) retornoAutenticacaoEol,
++ (UsuarioAutenticacaoRetornoDto UsuarioAutenticacaoRetornoDto, string CodigoRf, IEnumerable Perfis, bool PossuiCargoCJ, bool PossuiPerfilCJ) retornoAutenticacaoEol,
+ string login, AdministradorSuporteDto administradorSuporte = null);
+ }
+ }
+\ No newline at end of file
diff --git a/src/SME.SGP.Aplicacao/Interfaces/Integracoes/IServicoEOL.cs b/src/SME.SGP.Aplicacao/Interfaces/Integracoes/IServicoEOL.cs
index a764e6c877..f0f1e6c717 100644
--- a/src/SME.SGP.Aplicacao/Interfaces/Integracoes/IServicoEOL.cs
+++ b/src/SME.SGP.Aplicacao/Interfaces/Integracoes/IServicoEOL.cs
@@ -21,7 +21,7 @@ public interface IServicoEol
Task AtribuirPerfil(string codigoRf, Guid perfil);
- Task Autenticar(string login, string senha);
+ Task Autenticar(string login, string senha);
IEnumerable BuscarCiclos();
@@ -78,7 +78,7 @@ public interface IServicoEol
Task ObterPerfisPorLogin(string login);
- Task CarregarDadosAcessoPorLoginPerfil(string login, Guid perfilGuid, AdministradorSuporteDto administradorSuporte = null);
+ Task CarregarDadosAcessoPorLoginPerfil(string login, Guid perfilGuid, AdministradorSuporteDto administradorSuporte = null);
Task> ObterProfessoresAutoComplete(int anoLetivo, string dreId, string ueId, string nomeProfessor);
diff --git a/src/SME.SGP.Aplicacao/Interfaces/Servicos/IServicoAutenticacao.cs b/src/SME.SGP.Aplicacao/Interfaces/Servicos/IServicoAutenticacao.cs
index 3e784f7555..735d478266 100644
--- a/src/SME.SGP.Aplicacao/Interfaces/Servicos/IServicoAutenticacao.cs
+++ b/src/SME.SGP.Aplicacao/Interfaces/Servicos/IServicoAutenticacao.cs
@@ -9,7 +9,9 @@ public interface IServicoAutenticacao
{
Task AlterarSenha(string login, string senhaAtual, string novaSenha);
- Task<(UsuarioAutenticacaoRetornoDto, string, IEnumerable, bool, bool)> AutenticarNoEol(string login, string senha);
+ //sugestao de nomear tuplas se for manter ou trocar para records ou tipos de estrutura mais flexiveis
+ //que encapsulem o retorno
+ Task<(UsuarioAutenticacaoRetornoDto UsuarioAutenticacaoRetornoDto, string CodigoRf, IEnumerable Perfis, bool PossuiCargoCJ, bool PossuiPerfilCJ)> AutenticarNoEol(string login, string senha);
bool TemPerfilNoToken(string guid);
diff --git a/src/SME.SGP.Aplicacao/Queries/Aluno/ObterAlunosAtivosPorTurmaCodigo/ObterAlunosAtivosPorTurmaCodigoQueryHandler.cs.rej b/src/SME.SGP.Aplicacao/Queries/Aluno/ObterAlunosAtivosPorTurmaCodigo/ObterAlunosAtivosPorTurmaCodigoQueryHandler.cs.rej
new file mode 100644
index 0000000000..8b86b4bc72
--- /dev/null
+++ b/src/SME.SGP.Aplicacao/Queries/Aluno/ObterAlunosAtivosPorTurmaCodigo/ObterAlunosAtivosPorTurmaCodigoQueryHandler.cs.rej
@@ -0,0 +1,12 @@
+diff a/src/SME.SGP.Aplicacao/Queries/Aluno/ObterAlunosAtivosPorTurmaCodigo/ObterAlunosAtivosPorTurmaCodigoQueryHandler.cs b/src/SME.SGP.Aplicacao/Queries/Aluno/ObterAlunosAtivosPorTurmaCodigo/ObterAlunosAtivosPorTurmaCodigoQueryHandler.cs (rejected hunks)
+@@ -28,7 +28,9 @@ namespace SME.SGP.Aplicacao
+ if (!resposta.IsSuccessStatusCode)
+ throw new NegocioException("Não foi possível buscar alunos ativos no EOL.");
+
+- var json = resposta.Content.ReadAsStringAsync().Result;
++ //Outro caso por exemplo ainda mais simples de .Result que poderia ser await ja que está num metodo async
++ //Sempre passar para frente tambem cancellationTokens
++ var json = await resposta.Content.ReadAsStringAsync(cancellationToken);
+ return JsonConvert.DeserializeObject>(json);
+ }
+ }
diff --git a/src/SME.SGP.Aplicacao/Queries/Usuario/ObterAdministradorDoSuporte/ObterAdministradorDoSuporteQuery.cs b/src/SME.SGP.Aplicacao/Queries/Usuario/ObterAdministradorDoSuporte/ObterAdministradorDoSuporteQuery.cs
index b7ef1785db..90e9594512 100644
--- a/src/SME.SGP.Aplicacao/Queries/Usuario/ObterAdministradorDoSuporte/ObterAdministradorDoSuporteQuery.cs
+++ b/src/SME.SGP.Aplicacao/Queries/Usuario/ObterAdministradorDoSuporte/ObterAdministradorDoSuporteQuery.cs
@@ -5,5 +5,6 @@ namespace SME.SGP.Aplicacao
{
public class ObterAdministradorDoSuporteQuery : IRequest