package com.hithomelabs.CFTunnels.Services; import com.hithomelabs.CFTunnels.Entity.Mapping; import com.hithomelabs.CFTunnels.Entity.Request; import com.hithomelabs.CFTunnels.Entity.Tunnel; import com.hithomelabs.CFTunnels.Entity.User; import com.hithomelabs.CFTunnels.Models.Ingress; import com.hithomelabs.CFTunnels.Repositories.MappingRepository; import com.hithomelabs.CFTunnels.Repositories.RequestRepository; import com.hithomelabs.CFTunnels.Repositories.TunnelRepository; import com.hithomelabs.CFTunnels.Repositories.UserRepository; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.oauth2.core.oidc.user.OidcUser; import org.springframework.stereotype.Service; import java.util.Map; import java.util.UUID; @Service public class MappingRequestService { @Autowired UserRepository userRepository; @Autowired MappingRepository mappingRepository; @Autowired RequestRepository requestRepository; @Autowired TunnelRepository tunnelRepository; public Mapping createMapping(UUID tunnelId, Ingress ingress){ Tunnel tunnel = tunnelRepository.findByCfTunnelId(tunnelId).orElseThrow(() -> new RuntimeException("Tunnel not found")); Mapping mapping = createMappingFromTunnelIngress(tunnel, ingress); return mappingRepository.save(mapping); } public Request createRequest(Mapping mapping, User user){ Request request = new Request(); request.setMapping(mapping); request.setCreatedBy(user); request.setStatus(Request.RequestStatus.PENDING); return requestRepository.save(request); } public Request createMappingRequest(String tunnelId, Ingress ingress, OidcUser oidcUser){ User user = userRepository.findByEmail(oidcUser.getEmail()).orElseGet(()-> mapUser(oidcUser)); Mapping mapping = createMapping(UUID.fromString(tunnelId), ingress); return createRequest(mapping, user); } public User mapUser(OidcUser oidcUser){ String email = oidcUser.getEmail(); String name = oidcUser.getNickName(); User user = new User(); user.setEmail(email); user.setName(name); userRepository.save(user); return user; } public Mapping createMappingFromTunnelIngress(Tunnel tunnel, Ingress ingress){ Mapping mapping = new Mapping(); mapping.setTunnel(tunnel); mapping.setPort(Integer.parseInt(ingress.getService().split(":")[2])); mapping.setSubdomain(ingress.getHostname().split("\\.")[0]); return mapping; } }