First Commit

This commit is contained in:
Carlos Henrique
2026-02-24 22:16:53 -03:00
commit 3edd6bc194
21 changed files with 977 additions and 0 deletions

View File

@@ -0,0 +1,13 @@
package br.com.stackpanel.api;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class ApiApplication {
public static void main(String[] args) {
SpringApplication.run(ApiApplication.class, args);
}
}

View File

@@ -0,0 +1,20 @@
package br.com.stackpanel.api.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.client.RestClient;
@Configuration
public class RestClientConfig {
@Bean
public RestClient customRestClient(){
return RestClient.builder()
.baseUrl("https://coolify.stackpanel.com.br")
.build();
}
}

View File

@@ -0,0 +1,38 @@
package br.com.stackpanel.api.controller;
import br.com.stackpanel.api.entity.dto.CoolifyResponse;
import br.com.stackpanel.api.entity.dto.CoolifyResponseProjects;
import br.com.stackpanel.api.service.CoolifyService;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@CrossOrigin("*")
@RestController
@RequestMapping("/projects")
public class CoolifyController {
private final CoolifyService coolifyService;
public CoolifyController(CoolifyService coolifyService) {
this.coolifyService = coolifyService;
}
@GetMapping("/buscar")
public List<CoolifyResponse> buscarProjects(){
return coolifyService.buscarProjects();
}
@GetMapping("/buscarProject")
public CoolifyResponseProjects buscarProjectsUuid(@RequestParam(name = "uuid") String uuid){
return coolifyService.buscarProjetosUuid(uuid);
}
@GetMapping("/buscarTodos")
public CoolifyResponseProjects buscarTodosProjects(){
return coolifyService.buscarProjetosUuids();
}
}

View File

@@ -0,0 +1,64 @@
package br.com.stackpanel.api.entity;
import jakarta.persistence.*;
@Entity
@Table(name = "TPROJECT", schema = "CLFADM")
public class CoolifyPersistence {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column(name = "CODPRT")
private Long sequence;
@Column(name = "NAMPRT")
private String nameProject;
@Column(name = "UUID")
private String uudi;
@Column(name = "DSCPRT")
private String description;
public CoolifyPersistence() {
}
public CoolifyPersistence(Long sequence, String nameProject, String uudi, String description) {
this.sequence = sequence;
this.nameProject = nameProject;
this.uudi = uudi;
this.description = description;
}
public Long getSequence() {
return sequence;
}
public void setSequence(Long sequence) {
this.sequence = sequence;
}
public String getNameProject() {
return nameProject;
}
public void setNameProject(String nameProject) {
this.nameProject = nameProject;
}
public String getUudi() {
return uudi;
}
public void setUudi(String uudi) {
this.uudi = uudi;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
}

View File

@@ -0,0 +1,4 @@
package br.com.stackpanel.api.entity.dto;
public record CoolifyResponse(Long id, String uuid, String name, String description) {
}

View File

@@ -0,0 +1,9 @@
package br.com.stackpanel.api.entity.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import java.util.List;
@JsonIgnoreProperties(ignoreUnknown = true)
public record CoolifyResponseProjects(List<MysqlResponse> mysqls, List<ServiceResponse> services) {
}

View File

@@ -0,0 +1,8 @@
package br.com.stackpanel.api.entity.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
import com.fasterxml.jackson.annotation.JsonProperty;
@JsonIgnoreProperties(ignoreUnknown = true)
public record MysqlResponse(String name, String uuid, String image, @JsonProperty("public_port") Long publicPort) {
}

View File

@@ -0,0 +1,7 @@
package br.com.stackpanel.api.entity.dto;
import com.fasterxml.jackson.annotation.JsonIgnoreProperties;
@JsonIgnoreProperties(ignoreUnknown = true)
public record ServiceResponse(String name, String uuid) {
}

View File

@@ -0,0 +1,38 @@
package br.com.stackpanel.api.entity.mapper;
import br.com.stackpanel.api.entity.CoolifyPersistence;
import br.com.stackpanel.api.entity.dto.CoolifyResponse;
import org.springframework.stereotype.Component;
import java.util.List;
@Component
public class CoolifyMapper {
public CoolifyPersistence toDomain(CoolifyResponse response){
if (response == null){
return null;
}
return new CoolifyPersistence(
response.id(),
response.name(),
response.uuid(),
response.description()
);
}
public List<CoolifyPersistence> toDomainList(List<CoolifyResponse> responses){
if (responses == null){
return List.of();
}
return responses.stream()
.map(this::toDomain)
.toList();
}
}

View File

@@ -0,0 +1,43 @@
package br.com.stackpanel.api.integration;
import br.com.stackpanel.api.config.RestClientConfig;
import br.com.stackpanel.api.entity.dto.CoolifyResponse;
import br.com.stackpanel.api.entity.dto.CoolifyResponseProjects;
import org.springframework.core.ParameterizedTypeReference;
import org.springframework.http.MediaType;
import org.springframework.stereotype.Component;
import org.springframework.web.client.RestClient;
import java.util.List;
@Component
public class CoolifyClient {
private final RestClient restClientConfig;
public CoolifyClient(RestClient restClientConfig) {
this.restClientConfig = restClientConfig;
}
public List<CoolifyResponse> buscarProjects(){
return this.restClientConfig.get()
.uri("/api/v1/projects/")
.accept(MediaType.APPLICATION_JSON)
.header("Content-Type", "application/json")
.header("Authorization", "Bearer 6|JDmqzDFYjZbHKGEt3jjMERvvMTKNsDjsugQQkZtg28e56c42")
.retrieve()
.body(new ParameterizedTypeReference<List<CoolifyResponse>>() {});
}
public CoolifyResponseProjects buscarProjectsUuid(String uuid){
return this.restClientConfig.get()
.uri("/api/v1/projects/{uuid}/production", uuid)
.accept(MediaType.APPLICATION_JSON)
.header("Content-Type", "application/json")
.header("Authorization", "Bearer 6|JDmqzDFYjZbHKGEt3jjMERvvMTKNsDjsugQQkZtg28e56c42")
.retrieve()
.body(new ParameterizedTypeReference<CoolifyResponseProjects>() {});
}
}

View File

@@ -0,0 +1,14 @@
package br.com.stackpanel.api.repository;
import br.com.stackpanel.api.entity.CoolifyPersistence;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.stereotype.Repository;
@Repository
public interface CoolifyRepository extends JpaRepository<CoolifyPersistence, Long> {
@Query(value = "SELECT col FROM CoolifyPersistence col WHERE col.uudi in (:uuid)")
CoolifyPersistence buscarProjectsUUIDs(String uuid);
}

View File

@@ -0,0 +1,16 @@
package br.com.stackpanel.api.service;
import br.com.stackpanel.api.entity.dto.CoolifyResponse;
import br.com.stackpanel.api.entity.dto.CoolifyResponseProjects;
import java.util.List;
public interface CoolifyService {
List<CoolifyResponse> buscarProjects();
CoolifyResponseProjects buscarProjetosUuid(String uuid);
CoolifyResponseProjects buscarProjetosUuids();
}

View File

@@ -0,0 +1,73 @@
package br.com.stackpanel.api.service.impl;
import br.com.stackpanel.api.entity.CoolifyPersistence;
import br.com.stackpanel.api.entity.dto.CoolifyResponse;
import br.com.stackpanel.api.entity.dto.CoolifyResponseProjects;
import br.com.stackpanel.api.entity.dto.MysqlResponse;
import br.com.stackpanel.api.entity.dto.ServiceResponse;
import br.com.stackpanel.api.entity.mapper.CoolifyMapper;
import br.com.stackpanel.api.integration.CoolifyClient;
import br.com.stackpanel.api.repository.CoolifyRepository;
import br.com.stackpanel.api.service.CoolifyService;
import org.springframework.stereotype.Service;
import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import java.util.stream.Collector;
import java.util.stream.Collectors;
@Service
public class CoolifyServiceImpl implements CoolifyService {
private final CoolifyClient coolifyClient;
private final CoolifyRepository repository;
private final CoolifyMapper mapper;
public CoolifyServiceImpl(CoolifyClient coolifyClient, CoolifyRepository repository, CoolifyMapper mapper) {
this.coolifyClient = coolifyClient;
this.repository = repository;
this.mapper = mapper;
}
public List<CoolifyResponse> buscarProjects(){
return coolifyClient.buscarProjects();
}
// public List<CoolifyPersistence> salvarProjetos(){
// List<CoolifyResponse> response = coolifyClient.buscarProjects();
//
// List<String> uuids = new ArrayList<>();
//
// for (CoolifyResponse unique: response) {
// uuids.add(unique.uuid());
// }
//
// return uuids;
//
// }
@Override
public CoolifyResponseProjects buscarProjetosUuid(String uuid){
return coolifyClient.buscarProjectsUuid(uuid);
}
@Override
public CoolifyResponseProjects buscarProjetosUuids(){
List<CoolifyResponseProjects> buscarPorUuids = coolifyClient.buscarProjects().stream()
.map(uuids -> coolifyClient.buscarProjectsUuid(uuids.uuid()))
.toList();
List<MysqlResponse> listaDeMysqls = buscarPorUuids.stream()
.flatMap(flat -> flat.mysqls().stream())
.toList();
List<ServiceResponse> listaDeServices = buscarPorUuids.stream()
.flatMap(flat -> flat.services().stream())
.toList();
return new CoolifyResponseProjects(listaDeMysqls, listaDeServices);
}
}

View File

@@ -0,0 +1,10 @@
spring.application.name=Nexus
spring.config.activate.on-profile=local
spring.datasource.password=SnLcLToyTLVlTmODy9X8WkJLxD5M6i7rFJEQPUgnrIqwH9zYpkX7rczfH8wcPSD1
spring.datasource.username=nexus
spring.datasource.url=jdbc:postgresql://129.153.206.118:5676/nexusdb
spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

View File

@@ -0,0 +1,4 @@
spring.application.name=Nexus
server.port=8080
spring.profiles.active=local

View File

@@ -0,0 +1,13 @@
package br.com.stackpanel.api;
import org.junit.jupiter.api.Test;
import org.springframework.boot.test.context.SpringBootTest;
@SpringBootTest
class ApiApplicationTests {
@Test
void contextLoads() {
}
}