Skip to content

Commit 0b5fa99

Browse files
committed
Merge feature/api-gateway into main: alterações de autenticação no mobile e gateway
2 parents a9b9b9b + fd8d71b commit 0b5fa99

22 files changed

Lines changed: 1672 additions & 50 deletions

src/backend/Usuarios.API/Controllers/AuthControllers.cs

Lines changed: 122 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
using BCrypt.Net;
88
// Criamos um alias para evitar o conflito de nomes
99
using UserEntity = Usuario.API.Models.Usuario;
10+
using MongoDB.Bson;
11+
using Microsoft.Extensions.DependencyInjection;
1012

1113
namespace Usuarios.API.Controllers;
1214

@@ -15,13 +17,31 @@ namespace Usuarios.API.Controllers;
1517
public class AuthController : ControllerBase
1618
{
1719
// Usando o alias 'UserEntity' em vez de 'Usuario'
18-
private readonly IMongoCollection<UserEntity> _usuarios;
20+
private readonly IMongoCollection<UserEntity>? _usuarios;
1921
private readonly IConfiguration _config;
20-
private readonly Usuario.API.Services.EmailService _emailService;
22+
private readonly Usuario.API.Services.EmailService? _emailService;
2123

22-
public AuthController(IMongoDatabase database, IConfiguration config, Usuario.API.Services.EmailService emailService)
24+
// Fallback em memória para desenvolvimento quando Mongo estiver inacessível
25+
private static readonly System.Collections.Concurrent.ConcurrentDictionary<string, UserEntity> _inMemoryUsers = new();
26+
27+
private bool UseInMemory => _usuarios == null;
28+
29+
public AuthController(
30+
IMongoDatabase database,
31+
IConfiguration config,
32+
Usuario.API.Services.EmailService? emailService)
2333
{
24-
_usuarios = database.GetCollection<UserEntity>("usuarios");
34+
try
35+
{
36+
// Tentar obter a collection normalmente
37+
_usuarios = database.GetCollection<UserEntity>("usuarios", null);
38+
}
39+
catch (Exception ex)
40+
{
41+
Console.WriteLine("[WARN] Não foi possível inicializar collection do MongoDB: " + ex.Message);
42+
_usuarios = null;
43+
}
44+
2545
_config = config;
2646
_emailService = emailService;
2747
}
@@ -41,7 +61,24 @@ public async Task<IActionResult> Registrar([FromBody] RegisterRequest request)
4161
if (string.IsNullOrWhiteSpace(request.Senha))
4262
return BadRequest(new { mensagem = "Senha é obrigatória." });
4363

44-
var existe = await _usuarios.Find(x => x.Email == request.Email).FirstOrDefaultAsync();
64+
UserEntity? existe = null;
65+
if (!UseInMemory)
66+
{
67+
try
68+
{
69+
existe = await _usuarios!.Find(x => x.Email == request.Email).FirstOrDefaultAsync();
70+
}
71+
catch (Exception ex)
72+
{
73+
Console.WriteLine("[WARN] Erro ao consultar Mongo (registrar): " + ex.Message);
74+
existe = null;
75+
}
76+
}
77+
else
78+
{
79+
existe = _inMemoryUsers.Values.FirstOrDefault(u => u.Email == request.Email);
80+
}
81+
4582
if (existe != null)
4683
return BadRequest(new { mensagem = "E-mail já cadastrado." });
4784

@@ -52,7 +89,17 @@ public async Task<IActionResult> Registrar([FromBody] RegisterRequest request)
5289
Senha = BCrypt.Net.BCrypt.HashPassword(request.Senha)
5390
};
5491

55-
await _usuarios.InsertOneAsync(novoUsuario);
92+
if (!UseInMemory)
93+
{
94+
await _usuarios!.InsertOneAsync(novoUsuario);
95+
}
96+
else
97+
{
98+
// Simular Id tipo ObjectId
99+
novoUsuario.Id = ObjectId.GenerateNewId().ToString();
100+
_inMemoryUsers.TryAdd(novoUsuario.Id!, novoUsuario);
101+
}
102+
56103
return Created("", new { mensagem = "Usuário registrado com sucesso!", id = novoUsuario.Id });
57104
}
58105
catch (Exception ex)
@@ -66,7 +113,24 @@ public async Task<IActionResult> Registrar([FromBody] RegisterRequest request)
66113
[HttpPost("login")]
67114
public async Task<IActionResult> Login([FromBody] LoginRequest request)
68115
{
69-
var usuario = await _usuarios.Find(x => x.Email == request.Email).FirstOrDefaultAsync();
116+
UserEntity? usuario = null;
117+
118+
if (!UseInMemory)
119+
{
120+
try
121+
{
122+
usuario = await _usuarios!.Find(x => x.Email == request.Email).FirstOrDefaultAsync();
123+
}
124+
catch (Exception ex)
125+
{
126+
Console.WriteLine("[WARN] Erro ao consultar Mongo (login): " + ex.Message);
127+
usuario = null;
128+
}
129+
}
130+
else
131+
{
132+
usuario = _inMemoryUsers.Values.FirstOrDefault(u => u.Email == request.Email);
133+
}
70134

71135
if (usuario == null || !BCrypt.Net.BCrypt.Verify(request.Senha, usuario.Senha))
72136
return Unauthorized(new { mensagem = "E-mail ou senha inválidos." });
@@ -84,7 +148,24 @@ public async Task<IActionResult> ForgotPassword([FromBody] ForgotPasswordRequest
84148
if (!IsValidEmail(request.Email))
85149
return BadRequest(new { mensagem = "E-mail inválido." });
86150

87-
var usuario = await _usuarios.Find(x => x.Email == request.Email).FirstOrDefaultAsync();
151+
UserEntity? usuario = null;
152+
if (!UseInMemory)
153+
{
154+
try
155+
{
156+
usuario = await _usuarios!.Find(x => x.Email == request.Email).FirstOrDefaultAsync();
157+
}
158+
catch (Exception ex)
159+
{
160+
Console.WriteLine("[WARN] Erro ao consultar Mongo (forgot-password): " + ex.Message);
161+
usuario = null;
162+
}
163+
}
164+
else
165+
{
166+
usuario = _inMemoryUsers.Values.FirstOrDefault(u => u.Email == request.Email);
167+
}
168+
88169
if (usuario == null)
89170
{
90171
// Não vazamos se o e-mail existe.
@@ -130,16 +211,46 @@ public async Task<IActionResult> ResetPassword([FromBody] ResetPasswordRequest r
130211
if (request.NewPassword.Length < 6)
131212
return BadRequest(new { mensagem = "A senha deve ter ao menos 6 caracteres." });
132213

133-
var usuario = await _usuarios.Find(x => x.Email == request.Email).FirstOrDefaultAsync();
214+
UserEntity? usuario = null;
215+
if (!UseInMemory)
216+
{
217+
try
218+
{
219+
usuario = await _usuarios!.Find(x => x.Email == request.Email).FirstOrDefaultAsync();
220+
}
221+
catch (Exception ex)
222+
{
223+
Console.WriteLine("[WARN] Erro ao consultar Mongo (reset-password): " + ex.Message);
224+
usuario = null;
225+
}
226+
}
227+
else
228+
{
229+
usuario = _inMemoryUsers.Values.FirstOrDefault(u => u.Email == request.Email);
230+
}
231+
134232
if (usuario == null)
135233
return BadRequest(new { mensagem = "Usuário não encontrado." });
136234

137235
// Aqui, validar o token (simples, apenas verificar se existe; em produção, verificar expiração)
138236
// Por simplicidade, aceitamos qualquer token por enquanto
139237

140238
var hashedPassword = BCrypt.Net.BCrypt.HashPassword(request.NewPassword);
141-
var update = Builders<UserEntity>.Update.Set(u => u.Senha, hashedPassword);
142-
await _usuarios.UpdateOneAsync(x => x.Email == request.Email, update);
239+
240+
if (!UseInMemory)
241+
{
242+
var update = Builders<UserEntity>.Update.Set(u => u.Senha, hashedPassword);
243+
await _usuarios!.UpdateOneAsync(x => x.Email == request.Email, update);
244+
}
245+
else
246+
{
247+
var existing = _inMemoryUsers.Values.FirstOrDefault(u => u.Email == request.Email);
248+
if (existing != null && existing.Id != null)
249+
{
250+
existing.Senha = hashedPassword;
251+
_inMemoryUsers[existing.Id] = existing;
252+
}
253+
}
143254

144255
return Ok(new { mensagem = "Senha redefinida com sucesso." });
145256
}

src/backend/appsettings.Development.json

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,5 +20,8 @@
2020
"SenderEmail": "suportepagaai@gmail.com",
2121
"SenderPassword": "ucuzgopepeoilfvo",
2222
"EnableSsl": true
23+
},
24+
"FrontendSettings": {
25+
"Url": "https://pagai-frontend-h0ece2hjcbb7gag7.eastus-01.azurewebsites.net"
2326
}
2427
}

src/mobile/.expo/README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,13 @@
11
> Why do I have a folder named ".expo" in my project?
2+
23
The ".expo" folder is created when an Expo project is started using "expo start" command.
4+
35
> What do the files contain?
6+
47
- "devices.json": contains information about devices that have recently opened this project. This is used to populate the "Development sessions" list in your development builds.
58
- "settings.json": contains the server configuration that is used to serve the application manifest.
9+
610
> Should I commit the ".expo" folder?
11+
712
No, you should not share the ".expo" folder. It does not contain any information that is relevant for other developers working on the project, it is specific to your machine.
813
Upon project creation, the ".expo" folder is already added to your ".gitignore" file.

src/mobile/app.json

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,11 @@
44
"slug": "paga-ai",
55
"version": "1.0.0",
66
"orientation": "portrait",
7-
"platforms": ["ios", "android"],
7+
"platforms": ["ios", "android", "web"],
88
"scheme": "pagaai",
99
"userInterfaceStyle": "automatic",
1010
"assetBundlePatterns": ["**/*"],
11+
"newArchEnabled": false,
1112
"ios": {
1213
"supportsTablet": true
1314
},

0 commit comments

Comments
 (0)