3
respostas

[Projeto] Arquitetura do projeto : Persistência de dados e consultas com Spring Data JPA

Arquitetura

  1. Artista: classe para representar um artista, com atributos como nome, tipo (solo, dupla ou banda) e lista de músicas associadas.
  2. Música: classe para representar uma música, com atributos como título, gênero e artista associado.
  3. ArtistaRepository: interface para realizar operações de persistência com a classe Artista.
  4. MúsicaRepository: interface para realizar operações de persistência com a classe Música.
  5. ArtistaService: classe para encapsular a lógica de negócios relacionada aos artistas, incluindo a integração com a API do ChatGPT.
  6. MúsicaService: classe para encapsular a lógica de negócios relacionada às músicas.
  7. Main: classe principal que contém o menu de opções para o usuário.
3 respostas

@Entity public class Artista { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String nome; private TipoArtista tipo; @OneToMany(mappedBy = "artista", cascade = CascadeType.ALL, orphanRemoval = true) private List<Música> músicas; // getters e setters }

enum TipoArtista { SOLO, DUPLA, BANDA }

@Entity public class Música { @Id @GeneratedValue(strategy = GenerationType.IDENTITY) private Long id; private String título; private String gênero; @ManyToOne @JoinColumn(name = "artista_id") private Artista artista; // getters e setters }

public interface ArtistaRepository extends JpaRepository<Artista, Long> { }

public interface MúsicaRepository extends JpaRepository<Música, Long> { }

@Service public class ArtistaService { @Autowired private ArtistaRepository artistaRepository; @Autowired private ChatGPTClient chatGPTClient;

public void cadastrarArtista(Artista artista) {
    // verificar se o artista já está cadastrado
    Artista artistaExistente = artistaRepository.findByNome(artista.getNome());
    if (artistaExistente != null) {
        // atualizar informações do artista existente
    } else {
        // cadastrar novo artista
        artistaRepository.save(artista);
    }
}

public List<Música> buscarMúsicasPorArtista(Long artistaId) {
    // buscar músicas associadas ao artista
    return artistaRepository.findById(artistaId).get().getMúsicas();
}

public String buscarInformaçõesSobreArtista(Long artistaId) {
    // buscar informações sobre o artista usando a API do ChatGPT
    return chatGPTClient.getArtistaInformações(artistaId);
}

}

@Service public class MúsicaService { @Autowired private MúsicaRepository músicaRepository;

public void cadastrarMúsica(Música música) {
    // verificar se o artista associado à música já está cadastrado
    Artista artista = música.getArtista();
    if (artistaRepository.findByNome(artista.getNome()) == null) {
        // cadastrar novo artista
        artistaRepository.save(artista);
    }
    // cadastrar música
    músicaRepository.save(música);
}

}

public class Main { @Autowired private ArtistaService artistaService; @Autowired private MúsicaService músicaService;

public static void main(String[] args) {
    SpringApplication.run(Main.class, args);
}

public void run(String... args) {
    Scanner scanner = new Scanner(System.in);
    while (true) {
        System.out.println("Opções:");
        System.out.println("1. Cadastrar artista");
        System.out.println("2. Cadastrar música");
        System.out.println("3. Buscar músicas por artista");
        System.out.println("4. Buscar informações sobre artista");
        System.out.println("5. Sair");
        int opção = scanner.nextInt();
        switch (opção) {
            case 1:
                cadastrarArtista();
                break;
            case 2:
                cadastrarMúsica();
                break;
            case 3:
                buscarMúsicasPorArtista();
                break;
            case 4:
                buscarInformaçõesSobreArtista();
                break;
            case 5:
                System.exit(0);
                break;
            default:
                System.out.println("Opção inválida");
        }
    }
}

private void cadastrarArtista() { Scanner scanner = new Scanner(System.in); System.out.println("Insira o nome do artista:"); String nome = scanner.nextLine(); Artista artista = new Artista(nome, TipoArtista.SOLO); artistaService.cadastrarArtista(artista); }

private void cadastrarMúsica() {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Insira o título da música:");
    String título = scanner.nextLine();
    System.out.println("Insira o gênero da música:");
    String gênero = scanner.nextLine();
    Artista artista = new Artista("nome do artista", TipoArtista.SOLO);
    Música música = new Música(título, gênero, artista);
    músicaService.cadastrarMúsica(música);
}

private void buscarMúsicasPorArtista() {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Insira o ID do artista:");
    Long artistaId = scanner.nextLong();
    List<Música> músicas = artistaService.buscarMúsicasPorArtista(artistaId);
    System.out.println("Músicas associadas ao artista:");
    for (Música música : músicas) {
        System.out.println(música.getTítulo());
    }
}

private void buscarInformaçõesSobreArtista() {
    Scanner scanner = new Scanner(System.in);
    System.out.println("Insira o ID do artista:");
    Long artistaId = scanner.nextLong();
    String informações = artistaService.buscarInformaçõesSobreArtista(artistaId);
    System.out.println("Informações sobre o artista:");
    System.out.println(informações);
}

}

Oi Ricardo! Tudo bem?

Parabéns pela dedicação em realizar o desafio! :))

Muito legal ter definido a arquitetura antes de codar, isso ajuda muito a deixar as ideias mais claras.

Abraços e bons estudos!