Compare commits

..

3 Commits

Author SHA1 Message Date
Carlos Henrique
5ed8494db7 Merge branch 'develop'
Some checks failed
Build e Deploy / build-and-deploy (push) Has been cancelled
2026-02-27 18:46:30 -03:00
Carlos Henrique
6a46a1a379 Feito para pegar mais retornos da api do coolify. 2026-02-27 18:45:51 -03:00
Carlos Henrique
ec342f77a6 Feito endpoin de busca e salvar. 2026-02-26 05:16:34 -03:00
15 changed files with 379 additions and 335 deletions

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

@@ -1,73 +1,93 @@
package br.com.stackpanel.api.service.impl; package br.com.stackpanel.api.service.impl;
import br.com.stackpanel.api.entity.CoolifyPersistence; import br.com.stackpanel.api.entity.CoolifyPersistence;
import br.com.stackpanel.api.entity.dto.CoolifyResponse; import br.com.stackpanel.api.entity.dto.*;
import br.com.stackpanel.api.entity.dto.CoolifyResponseProjects; import br.com.stackpanel.api.entity.mapper.CoolifyMapper;
import br.com.stackpanel.api.entity.dto.MysqlResponse; import br.com.stackpanel.api.integration.CoolifyClient;
import br.com.stackpanel.api.entity.dto.ServiceResponse; import br.com.stackpanel.api.repository.CoolifyRepository;
import br.com.stackpanel.api.entity.mapper.CoolifyMapper; import br.com.stackpanel.api.service.CoolifyService;
import br.com.stackpanel.api.integration.CoolifyClient; import jakarta.transaction.Transactional;
import br.com.stackpanel.api.repository.CoolifyRepository; import org.springframework.stereotype.Service;
import br.com.stackpanel.api.service.CoolifyService;
import org.springframework.stereotype.Service; import java.util.ArrayList;
import java.util.Collection;
import java.util.ArrayList; import java.util.List;
import java.util.Collection; import java.util.Objects;
import java.util.List; import java.util.stream.Collector;
import java.util.stream.Collector; import java.util.stream.Collectors;
import java.util.stream.Collectors;
@Service
@Service public class CoolifyServiceImpl implements CoolifyService {
public class CoolifyServiceImpl implements CoolifyService {
private final CoolifyClient coolifyClient;
private final CoolifyClient coolifyClient; private final CoolifyRepository repository;
private final CoolifyRepository repository; private final CoolifyMapper mapper;
private final CoolifyMapper mapper;
public CoolifyServiceImpl(CoolifyClient coolifyClient, CoolifyRepository repository, CoolifyMapper mapper) {
public CoolifyServiceImpl(CoolifyClient coolifyClient, CoolifyRepository repository, CoolifyMapper mapper) { this.coolifyClient = coolifyClient;
this.coolifyClient = coolifyClient; this.repository = repository;
this.repository = repository; this.mapper = mapper;
this.mapper = mapper; }
}
@Override
public List<CoolifyResponse> buscarProjects(){ @Transactional
return coolifyClient.buscarProjects(); public List<CoolifyPersistence> buscarProjects(){
}
List<CoolifyResponse> projects = coolifyClient.buscarProjects();
// public List<CoolifyPersistence> salvarProjetos(){
// List<CoolifyResponse> response = coolifyClient.buscarProjects(); List<String> dbProjects = repository.buscarListaUuids();
//
// List<String> uuids = new ArrayList<>();
// if (!projects.isEmpty()) {
// for (CoolifyResponse unique: response) { projects.stream()
// uuids.add(unique.uuid()); .filter(item -> !dbProjects.contains(item.uuid()))
// } .map(mapper::toDomain)
// .map(this::salvarProjects)
// return uuids; .forEach(System.out::println);
//
// } }
@Override
public CoolifyResponseProjects buscarProjetosUuid(String uuid){ return repository.buscarProjects().stream()
return coolifyClient.buscarProjectsUuid(uuid); .toList();
}
@Override }
public CoolifyResponseProjects buscarProjetosUuids(){
List<CoolifyResponseProjects> buscarPorUuids = coolifyClient.buscarProjects().stream() private CoolifyPersistence salvarProjects(CoolifyPersistence coolifyPersistence){
.map(uuids -> coolifyClient.buscarProjectsUuid(uuids.uuid())) return repository.save(coolifyPersistence);
.toList(); }
List<MysqlResponse> listaDeMysqls = buscarPorUuids.stream() @Override
.flatMap(flat -> flat.mysqls().stream()) public CoolifyResponseProjects buscarProjetosUuid(String uuid){
.toList(); return coolifyClient.buscarProjectsUuid(uuid);
}
List<ServiceResponse> listaDeServices = buscarPorUuids.stream()
.flatMap(flat -> flat.services().stream()) @Override
.toList(); public CoolifyResponseProjects buscarProjetosUuids(){
return new CoolifyResponseProjects(listaDeMysqls, listaDeServices); 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();
List<ApplicationResponse> listaDeApplications = buscarPorUuids.stream()
.flatMap(item -> item.applications().stream())
.toList();
List<PostgreResponse> listaDePostgreSql = buscarPorUuids.stream()
.flatMap(item -> item.postgresqls().stream())
.toList();
return new CoolifyResponseProjects(listaDeMysqls, listaDeServices, listaDeApplications, listaDePostgreSql);
}
}

View File

@@ -3,7 +3,7 @@ spring.config.activate.on-profile=local
spring.datasource.password=SnLcLToyTLVlTmODy9X8WkJLxD5M6i7rFJEQPUgnrIqwH9zYpkX7rczfH8wcPSD1 spring.datasource.password=SnLcLToyTLVlTmODy9X8WkJLxD5M6i7rFJEQPUgnrIqwH9zYpkX7rczfH8wcPSD1
spring.datasource.username=nexus spring.datasource.username=nexus
spring.datasource.url=jdbc:postgresql://129.153.206.118:5676/nexusdb spring.datasource.url=jdbc:postgresql://db.stackpanel.com.br/nexusdb
spring.datasource.driver-class-name=org.postgresql.Driver spring.datasource.driver-class-name=org.postgresql.Driver
spring.jpa.hibernate.ddl-auto=update spring.jpa.hibernate.ddl-auto=update