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)) ]); } 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.']); } }