role ?? $u->cargo ?? '')); $ok=$u && ( in_array($role,['admin','administrador','administrator'],true) || (bool)($u->is_admin ?? false) || (int)($u->id ?? 0)===1 ); abort_unless($ok,403,'Acesso administrativo necessario.'); } public function resetIntegrations(Request $request, int $id) { $this->ensureAdmin(); abort_if($id<=0,404); abort_unless(DB::table('users')->where('id',$id)->exists(),404,'Jogador nao encontrado.'); $changed=[]; DB::transaction(function() use($id,&$changed){ // Não toca no AC7: Resetar AC7 continua sendo a ação já existente. $userColumns=[ 'discord_id','discord_user_id','discord_username','discord_nickname', 'discord_access_token','discord_refresh_token','discord_connected_at', 'teamspeak_uid','ts3_uid','teamspeak_id','teamspeak_nickname','ts3_nickname', 'crossfire_ign','crossfire_url','crossfire_profile_url','crossfire_id', 'voice_provider','voice_platform','communicator','communication_provider' ]; $set=[]; foreach($userColumns as $c) if(Schema::hasColumn('users',$c)) $set[$c]=null; if($set){ DB::table('users')->where('id',$id)->update($set); $changed[]='users'; } // Limpa somente vínculos de integração conhecidos; não remove partidas, ranking, Skill ou AC7. $tables=[ 'user_discord_connections','discord_connections','discord_user_links', 'user_teamspeak_connections','teamspeak_connections','teamspeak_user_links', 'user_crossfire_accounts','crossfire_accounts','player_crossfire_accounts', 'user_social_connections','social_connections' ]; foreach($tables as $t){ if(!Schema::hasTable($t)) continue; foreach(['user_id','uid','player_id'] as $col){ if(Schema::hasColumn($t,$col)){ DB::table($t)->where($col,$id)->delete(); $changed[]=$t; break; } } } }); return response()->json([ 'success'=>true, 'message'=>'Integrações do jogador resetadas. O Resetar AC7 não foi alterado.', 'changed'=>array_values(array_unique($changed)) ]); } private function clearUserColumns(int $id, array $columns): array { $set=[]; foreach($columns as $c) if(Schema::hasColumn('users',$c)) $set[$c]=null; if($set) DB::table('users')->where('id',$id)->update($set); return array_keys($set); } public function resetTeamSpeak(Request $request, int $id) { $this->ensureAdmin(); abort_unless(DB::table('users')->where('id',$id)->exists(),404,'Jogador nao encontrado.'); $cols=$this->clearUserColumns($id,[ 'ts3_unique_id','ts3_last_nickname','ts3_verification_status','ts3_verified_at', 'teamspeak_uid','ts3_uid','teamspeak_id','teamspeak_nickname','ts3_nickname','ts3_email' ]); return response()->json(['success'=>true,'message'=>'TeamSpeak resetado. O jogador devera integrar novamente.','columns'=>$cols]); } public function resetDiscord(Request $request, int $id) { $this->ensureAdmin(); abort_unless(DB::table('users')->where('id',$id)->exists(),404,'Jogador nao encontrado.'); $cols=$this->clearUserColumns($id,[ 'discord_id','discord_user_id','discord_username','discord_nickname', 'discord_access_token','discord_refresh_token','discord_connected_at', 'discord_verification_status','discord_verified_at' ]); return response()->json(['success'=>true,'message'=>'Discord resetado. O jogador devera integrar novamente.','columns'=>$cols]); } public function resetIgn(Request $request, int $id) { $this->ensureAdmin(); abort_unless(DB::table('users')->where('id',$id)->exists(),404,'Jogador nao encontrado.'); $cols=$this->clearUserColumns($id,[ 'crossfire_profile_url','crossfire_profile_id','crossfire_nickname', 'crossfire_verification_status','crossfire_verified_at','crossfire_secondary_accounts', 'crossfire_ign','crossfire_url','crossfire_id','game_profile_url','game_account_nickname', 'competitive_verification_status','competitive_verified_at' ]); return response()->json(['success'=>true,'message'=>'IGN / URL CrossFire resetados. O jogador devera validar novamente.','columns'=>$cols]); } public function destroy(Request $request, int $id) { $this->ensureAdmin(); $me=(int)(Auth::id() ?? 0); abort_if($id===$me,422,'Você não pode excluir a própria conta administrativa.'); abort_if($id===1,422,'A conta administrativa principal é protegida.'); abort_unless(DB::table('users')->where('id',$id)->exists(),404,'Jogador não encontrado.'); try { DB::table('users')->where('id',$id)->delete(); } catch(\Throwable $e) { return response()->json([ 'success'=>false, 'message'=>'Este jogador possui dados vinculados e não pode ser excluído diretamente. Suspenda a conta ou remova primeiro os vínculos obrigatórios.' ],409); } return response()->json(['success'=>true,'message'=>'Jogador excluído com sucesso.']); } }