-
Notifications
You must be signed in to change notification settings - Fork 0
/
Startup.cs
174 lines (148 loc) · 7.29 KB
/
Startup.cs
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
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using AutoMapper;
using gestao.Areas.Identity;
using gestao.Data;
using gestao.Data.Entities;
using gestao.Service;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Identity;
using Microsoft.AspNetCore.Identity.UI.Services;
using Microsoft.AspNetCore.Mvc;
using Microsoft.EntityFrameworkCore;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;
using Newtonsoft.Json;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.Logging;
using gestao.Service.ExtensionLogger;
namespace gestao
{
public class Startup
{
private readonly IConfiguration _config;
public Startup(IConfiguration config)
{
this._config = config;
}
// This method gets called by the runtime. Use this method to add services to the container.
// For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AppGestaoContext>(cfg =>{
cfg.UseSqlServer(_config.GetConnectionString("StringConexaoBancoGestao"));
});
services.BuildServiceProvider().GetService<AppGestaoContext>().Database.Migrate();
// Comentarios
// Aqui trago a funcionalidade de trabalhar com altenticação.
// Falo aqui para usar o Entity Framework para armazenar os dados.
services.AddIdentity<ApplicationUser, IdentityRole>(
options => options.SignIn.RequireConfirmedAccount = true)
.AddEntityFrameworkStores<AppGestaoContext>()
.AddDefaultUI()
.AddDefaultTokenProviders();
//Aqui vou registrar o serviço para poder usar Claims( ver Identity/)
services.AddScoped<IUserClaimsPrincipalFactory<ApplicationUser>,
ApplicationUserClaimsPrincipalFactory>();
//Registrando o EmailSender usando o SengGrid
services.AddTransient<IEmailSender, EmailSender>();
//Autenticação com google
services.AddAuthentication().AddGoogle(googleOptions =>
{
googleOptions.ClientId = _config["Authentication:Google:ClientId"];
googleOptions.ClientSecret = _config["Authentication:Google:ClientSecret"];
});
services.AddTransient<Seeder>();
// Comentarios:
// Lembrar que tenho que criar os AutoMapper profiles, que são uma maneira
// de configurar o mapeamento que for usar.
services.AddAutoMapper(Assembly.GetExecutingAssembly());
services.AddControllersWithViews()
.AddNewtonsoftJson(options =>
options.SerializerSettings.ReferenceLoopHandling = Newtonsoft.Json.ReferenceLoopHandling.Ignore);
services.AddRazorPages();// Preciso dele porque o Identity usa razor pages
services.AddTransient<IRepository, GestaoRepository>();
services.AddTransient<IProgressoesRepository, ProgressoesRepository>();
services.AddTransient<ICarreiraRepository, CarreiraRepository>();
services.AddTransient<IFuncionarioRepository, FuncionarioRepository>();
services.AddTransient<IFichaFuncionalRepository, FichaFuncionalRepository>();
// Comentários:
// Visto que estou usando Sessions, tenho que registrar esse serviço que
// vai me dar acesso ao contexto
services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>();
services.AddMemoryCache();
services.AddSession();
// Com esse serviço eu pego o carrinho da section.
// Temos aqui um objeto criado para cada requisição. Se duas pessoas solicitarem
// o objeto carrinho de ficha ao mesmo tempo, eles obtem instancias diferentes.
// Porque é criado um objeto para cada requisição
services.AddScoped(carrinhoFicha => CarrinhoFicha.GetCarrinho(carrinhoFicha));
services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app,
IWebHostEnvironment env, IServiceProvider serviceProvider,
ILoggerFactory loggerFactory)
{
// Aqui vou trabalhar com logger, mas enviando os log para meu Banco
loggerFactory.AddContext(LogLevel.Information, _config.GetConnectionString("StringConexaoBancoGestao"));
loggerFactory.AddContext(LogLevel.Error, _config.GetConnectionString("StringConexaoBancoGestao"));
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/error");
// Abordagens para tratar erro:
//app.UseStatusCodePages();
//app.UseStatusCodePages("text/html", "<h1> Status Code Page </h1>");
//app.UseStatusCodePagesWithRedirects("MinhaPaginaErro/{0}");
//app.UseStatusCodePagesWithReExecute("MinhaPaginaErro/{0}");
}
app.UseStaticFiles();
app.UseSession();
//app.UseNodeModules();
app.UseRouting();
app.UseAuthentication();
app.UseAuthorization();
app.UseEndpoints(cfg =>
{
cfg.MapRazorPages(); //Preciso disso porque o Identity vai usar Razor Pages
cfg.MapAreaControllerRoute(
name: "areaAdministrativa",
areaName: "Admin",
pattern: "Admin/{controller=Admin}/{action=Index}/{id?}"
);
cfg.MapControllerRoute(
name: "funcionarioPorCarreira",
pattern: "FuncionarioCarreira/{porCarreira}",
defaults: new {Controller="FuncionarioCarreira", Action="Index"}
);
cfg.MapControllerRoute("Default", "{controller}/{action}/{id?}", new { controller = "App", Action = "Index" });
});
CreateRoles(serviceProvider).Wait();
}
private async Task CreateRoles(IServiceProvider serviceProvider)
{
var roleManager = serviceProvider.GetRequiredService<RoleManager<IdentityRole>>();
var userManager = serviceProvider.GetRequiredService<UserManager<ApplicationUser>>();
string[] rolesNames = { "Chefe do Setor", "Assistente do Setor", "Geral" };
IdentityResult result;
foreach (var namesRole in rolesNames)
{
var roleExist = await roleManager.RoleExistsAsync(namesRole);
if (!roleExist)
{
result = await roleManager.CreateAsync(new IdentityRole(namesRole));
}
}
}
}
}