77using BCrypt . Net ;
88// Criamos um alias para evitar o conflito de nomes
99using UserEntity = Usuario . API . Models . Usuario ;
10+ using MongoDB . Bson ;
11+ using Microsoft . Extensions . DependencyInjection ;
1012
1113namespace Usuarios . API . Controllers ;
1214
@@ -15,13 +17,31 @@ namespace Usuarios.API.Controllers;
1517public 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 }
0 commit comments