From 9141106d41025a6fb5d03778a6d1c6656974bc72 Mon Sep 17 00:00:00 2001
From: JotaJota96 <jjap96@gmail.com>
Date: Thu, 3 Oct 2019 02:34:22 -0300
Subject: [PATCH] Varias funciones de CUsuario implementadas, maniana sigo...

---
 .../src/Logica/Controladores/CUsuario.java    | 300 ++++++++++++++++--
 .../src/Logica/DatosDePrueba.java             |  10 +-
 .../src/Logica/Interfaces/IUsuario.java       |  17 +
 3 files changed, 305 insertions(+), 22 deletions(-)

diff --git a/UyTube_aplicacion/src/Logica/Controladores/CUsuario.java b/UyTube_aplicacion/src/Logica/Controladores/CUsuario.java
index 528560d..82b4340 100644
--- a/UyTube_aplicacion/src/Logica/Controladores/CUsuario.java
+++ b/UyTube_aplicacion/src/Logica/Controladores/CUsuario.java
@@ -1,5 +1,8 @@
 package Logica.Controladores;
 
+import JPAControllerClasses.CategoriaJpaController;
+import JPAControllerClasses.ListaPorDefectoJpaController;
+import JPAControllerClasses.UsuarioJpaController;
 import Logica.Clases.Categoria;
 import Logica.Clases.ListaPorDefecto;
 import Logica.Clases.Usuario;
@@ -11,8 +14,11 @@ import Logica.DataType.DtValoracion;
 import Logica.DataType.DtVideo;
 import Logica.Enumerados.Filtrado;
 import Logica.Enumerados.Ordenacion;
+import Logica.Fabrica;
+import Logica.Interfaces.IAdmin;
 import Logica.Interfaces.IUsuario;
 import java.util.ArrayList;
+import java.util.List;
 import java.util.Map;
 import java.util.TreeMap;
 
@@ -39,43 +45,164 @@ public class CUsuario implements IUsuario {
     
     
     //***************** Traer datos de la base de datos *******************
+    /**
+     * Lista los usuarios no eliminados desde la base de datos
+     * @return Mapa de usuarios indexados por nickname
+     */
     private Map<String, Usuario> obtenerUsuarios(){
         Map<String, Usuario> usuarios = new TreeMap();
+        try {
+            List<Usuario> usuariosEnBDD = new UsuarioJpaController().findUsuarioEntities();
+            for (Usuario u : usuariosEnBDD){
+                usuarios.put(u.getNickname(), u);
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e.getMessage());
+        }
         return usuarios;
     }
+
+    /**
+     * Lista las categorias desde la base de datos
+     * @return Mapa de categorias indexados por nombre
+     */
     private Map<String, Categoria> obtenerCategorias(){
         Map<String, Categoria> categorias = new TreeMap();
+        try {
+            List<Categoria> categoriasEnBDD = new CategoriaJpaController().findCategoriaEntities();
+            for (Categoria c : categoriasEnBDD){
+                categorias.put(c.getNombre(), c);
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e.getMessage());
+        }
         return categorias;
     }
+    
+    /**
+     * Lista los nombres de las listas por defecto desde la base de datos
+     * @return Mapa de listas por defecto indexados por nombre
+     */
     private Map<String, ListaPorDefecto> obtenerListasPorDefecto(){
         Map<String, ListaPorDefecto> ListasPorDefecto = new TreeMap();
+        try {
+            List<ListaPorDefecto> listasPorDefectoEnBDD = new ListaPorDefectoJpaController().findListaPorDefectoEntities();
+            for (ListaPorDefecto l : listasPorDefectoEnBDD){
+                ListasPorDefecto.put(l.getNombre(), l);
+            }
+        } catch (Exception e) {
+            throw new RuntimeException(e.getMessage());
+        }
         return ListasPorDefecto;
     }
     
     //******************** Funciones de la interfaz ************************
     @Override
     public void agregarVideoAListaDeReproduccion(int idLista) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        if (usuarioActual == null){
+            throw new RuntimeException("No se ha iniciado sesión");
+        }
+        if (usuarioSeleccionado == null){
+            throw new RuntimeException("El sistema no tiene un usuario seleccionado");
+        }
+        if (idVideoSeleccionado == 0){
+            throw new RuntimeException("El sistema no tiene un video seleccionado");
+        }
+        if (idLista == 0){
+            throw new RuntimeException("El ID de la lista de reproduccion no es valido");
+        }
+        usuarioActual.agregarVideoALista(idLista, idVideoSeleccionado, usuarioSeleccionado);
     }
 
     @Override
     public void altaComentario(DtComentario dtCom) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        if (usuarioActual == null){
+            throw new RuntimeException("No se ha iniciado sesión");
+        }
+        if (usuarioSeleccionado == null){
+            throw new RuntimeException("El sistema no tiene un usuario seleccionado");
+        }
+        if (dtCom == null){
+            throw new RuntimeException("El DataType comentario no puede ser null");
+        }
+        if (idVideoSeleccionado == 0){
+            throw new RuntimeException("El sistema no tiene un video seleccionado");
+        }
+        usuarioSeleccionado.agregarComentarioAVideo(idVideoSeleccionado, dtCom, usuarioActual);
     }
 
     @Override
     public void altaComentario(DtComentario dtCom, int idComPadre) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        if (usuarioActual == null){
+            throw new RuntimeException("No se ha iniciado sesión");
+        }
+        if (usuarioSeleccionado == null){
+            throw new RuntimeException("El sistema no tiene un usuario seleccionado");
+        }
+        if (dtCom == null){
+            throw new RuntimeException("El DataType comentario no puede ser null");
+        }
+        if (idVideoSeleccionado == 0){
+            throw new RuntimeException("El sistema no tiene un video seleccionado");
+        }
+        usuarioSeleccionado.agregarComentarioAVideo(idVideoSeleccionado, idComPadre, dtCom, usuarioActual);
     }
 
     @Override
     public void altaListaDeReproduccionParticular(DtListaDeReproduccion lista) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        if (usuarioActual == null) {
+            throw new RuntimeException("No se ha iniciado sesión");
+        }
+        if (lista == null) {
+            throw new RuntimeException("El DataType recibido es null");
+        }
+        if ( ! this.obtenerCategorias().containsKey(lista.getCategoria())) {
+            throw new RuntimeException("La categoria no existe");
+        }
+        usuarioActual.agregarListaParticular(lista);
     }
 
     @Override
     public void altaUsuarioCanal(DtUsuario usr, DtCanal canal) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        // valida datos recibidos
+        if (usr == null){
+            throw new RuntimeException("El DataType usuario no puede ser null");
+        }
+        if (canal == null){
+            throw new RuntimeException("El DataType canal no puede ser null");
+        }
+        if (existeNickname(usr.getNickname())){
+            throw new RuntimeException("El sistema ya tiene un usuario con ese nickname");
+        }
+        if (existeEmail(usr.getCorreo())){
+            throw new RuntimeException("El sistema ya tiene un usuario con ese correo");
+        }
+        // obtiene las listas por defecto que el usuario debera crear
+        ArrayList<String> listasDefault = new ArrayList();
+        for (Map.Entry<String, ListaPorDefecto> lpd : this.obtenerListasPorDefecto().entrySet()) {
+            listasDefault.add(lpd.getKey());
+        }
+        // Crea al usuario
+        Usuario nuevoUsuario = new Usuario(
+                usr.getNickname(), 
+                usr.getCorreo(), 
+                usr.getFechaNacimiento(), 
+                usr.getImagen(), 
+                usr.getContrasenia(), 
+                usr.getNombre(), 
+                usr.getApellido(), 
+                canal
+        );
+        // persiste el usuario
+        try {
+            new UsuarioJpaController().create(nuevoUsuario);
+        } catch (Exception e) {
+            throw new RuntimeException(e.getMessage());
+        }
+        // Actualiza sus listas por defecto
+        nuevoUsuario.actualizarListasPorDefecto(listasDefault);
+        // Le inicia la sesion
+        this.iniciarSesionUsuario(usr.getNickname(), usr.getContrasenia());
     }
 
     @Override
@@ -85,7 +212,12 @@ public class CUsuario implements IUsuario {
 
     @Override
     public void bajaUsuario() {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        // Bienvenido al parche
+        // La verdad no sabia bien como implementar esta funcion, asi que mejor no reinventar la rueda, uso la que ya existe  aunque implique llamar al otro controlador...
+        IAdmin ca = Fabrica.getInstancia().getIAdmin();
+        ca.seleccionarUsuarioActual(usuarioActual.getNickname());
+        cerrarSesion();
+        ca.bajaUsuario();
     }
 
     @Override
@@ -115,9 +247,49 @@ public class CUsuario implements IUsuario {
 
     @Override
     public boolean iniciarSesionUsuario(String nickOEmail, String contrasenia) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        if (usuarioActual != null){
+            throw new RuntimeException("Ya hay un usuario con la sesión iniciada");
+        }
+        Map<String, Usuario> usuarios = obtenerUsuarios();
+        boolean usuarioEncontrado = false;
+        usuarioActual = usuarios.get(nickOEmail);
+        if (usuarioActual == null){
+            for (Map.Entry<String, Usuario> u : usuarios.entrySet()) {
+                if (u.getValue().getCorreo().equals(nickOEmail)){
+                    usuarioActual = u.getValue();
+                    usuarioEncontrado = true;
+                    break;
+                }
+            }
+        }else{
+            usuarioEncontrado = true;
+        }
+        
+        if (usuarioEncontrado){
+            if (usuarioActual.validarContrasenia(contrasenia)){
+                return true;
+            }else{
+                usuarioActual = null;
+            }
+        }
+        return false;
     }
 
+    @Override
+    public void liberarMemoriaListaDeReproduccion(){
+        idListaSeleccionada = 0;
+    }
+    
+    @Override
+    public void liberarMemoriaUsuario(){
+        usuarioSeleccionado = null;
+    }
+    
+    @Override
+    public void liberarMemoriaVideo(){
+        idVideoSeleccionado = 0;
+    }
+    
     @Override
     public ArrayList<String> listarCategorias() {
         throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
@@ -135,17 +307,27 @@ public class CUsuario implements IUsuario {
 
     @Override
     public ArrayList<DtUsuario> listarUsuarioSeguidores() {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        if (this.usuarioSeleccionado == null){
+            throw new RuntimeException("El sistema no tiene un usuario seleccionado");
+        }
+        return usuarioSeleccionado.listarUsuariosSeguidores();
     }
 
     @Override
     public ArrayList<DtUsuario> listarUsuarioSeguidos() {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        if (this.usuarioSeleccionado == null){
+            throw new RuntimeException("El sistema no tiene un usuario seleccionado");
+        }
+        return usuarioSeleccionado.listarUsuariosSeguidos();
     }
 
     @Override
     public ArrayList<DtUsuario> listarUsuarios() {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        ArrayList<DtUsuario> ret = new ArrayList<>();
+        for (Map.Entry<String, Usuario> usuario : obtenerUsuarios().entrySet()) {
+              ret.add(usuario.getValue().getDT());
+        }
+        return ret;
     }
 
     @Override
@@ -180,12 +362,32 @@ public class CUsuario implements IUsuario {
 
     @Override
     public DtUsuario obtenerPropietarioDeVideo(int idVideo) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        // Esto es un parche, pero de los que nunca se despegan...
+        // A tiempos desesperados, medidas desesperadas
+        for (Map.Entry<String, Usuario> u : this.obtenerUsuarios().entrySet()){
+            try {
+                u.getValue().obtenerVideo(idVideo);
+                return u.getValue().getDT();
+            } catch (Exception e) {
+                // a seguir buscando
+            }
+        }
+        throw new RuntimeException("El iID de video no crresponde a ningun usuario");
     }
 
     @Override
     public DtUsuario obtenerPropietarioDeListaDeReproduccion(int idLista) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        // Esto es un parche, pero de los que nunca se despegan...
+        // A tiempos desesperados, medidas desesperadas
+        for (Map.Entry<String, Usuario> u : this.obtenerUsuarios().entrySet()){
+            try {
+                u.getValue().obtenerListaDeReproduccion(idLista);
+                return u.getValue().getDT();
+            } catch (Exception e) {
+                // a seguir buscando
+            }
+        }
+        throw new RuntimeException("El iID de video no crresponde a ningun usuario");
     }
 
     @Override
@@ -205,37 +407,97 @@ public class CUsuario implements IUsuario {
 
     @Override
     public void seguirUsuario() {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        if (this.usuarioActual == null){
+            throw new RuntimeException("No se ha iniciado sesión");
+        }
+        if (this.usuarioSeleccionado == null){
+            throw new RuntimeException("El sistema no tiene un usuario seleccionado");
+        }
+        usuarioActual.agregarOQuitarSeguido(usuarioSeleccionado);
+        try {
+            new UsuarioJpaController().edit(usuarioSeleccionado);
+            new UsuarioJpaController().edit(usuarioActual);
+        } catch (Exception e) {
+            throw new RuntimeException(e.getMessage());
+        }
     }
 
     @Override
     public DtUsuario seleccionarUsuario(String nickname) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        usuarioSeleccionado = obtenerUsuarios().get(nickname);
+        if (usuarioSeleccionado == null){
+            throw new RuntimeException("No se encontro ningun usuario con ese nickname");
+        }
+        return usuarioSeleccionado.getDT();
     }
 
     @Override
     public DtListaDeReproduccion seleccionarListaDeReproduccion(int idLista) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        if (this.usuarioSeleccionado == null){
+            String nick = this.obtenerPropietarioDeListaDeReproduccion(idLista).getNickname();
+            this.seleccionarUsuario(nick);
+        }
+        DtListaDeReproduccion ret = usuarioSeleccionado.obtenerListaDeReproduccion(idLista);
+        idListaSeleccionada = idLista;
+        return ret;
     }
 
     @Override
     public DtVideo seleccionarVideo(int idVideo) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        if (this.usuarioSeleccionado == null){
+            String nick = this.obtenerPropietarioDeVideo(idVideo).getNickname();
+            this.seleccionarUsuario(nick);
+        }
+        DtVideo ret = usuarioSeleccionado.obtenerVideoDeCanal(idVideo);
+        idVideoSeleccionado = idVideo;
+        return ret;
     }
 
     @Override
     public boolean validarNuevaListaParticular(String nombre) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        if (this.usuarioActual == null){
+            throw new RuntimeException("No se ha iniciado sesión");
+        }
+        if (obtenerListasPorDefecto().containsKey(nombre)) {
+            return false;
+        }
+        if (idListaSeleccionada != 0){
+            if (usuarioActual.obtenerListaDeReproduccion(idListaSeleccionada).getNombre().equals(nombre)){
+                return true;
+            }
+        }
+        return usuarioActual.validarListaParticular(nombre);
     }
 
     @Override
     public boolean validarNuevoVideo(String nombre) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        if (this.usuarioActual == null){
+            throw new RuntimeException("No se ha iniciado sesión");
+        }
+        if (idVideoSeleccionado != 0){
+            if (usuarioActual.obtenerVideo(idVideoSeleccionado).getNombre().equals(nombre)){
+                return true;
+            }
+        }
+        return usuarioActual.validarListaParticular(nombre);
     }
 
     @Override
     public void valorarVideo(DtValoracion val) {
-        throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
+        if (this.usuarioActual == null){
+            throw new RuntimeException("No se ha iniciado sesión");
+        }
+        if (usuarioSeleccionado == null){
+            throw new RuntimeException("El sistema no tiene un usuario seleccionado");
+        }
+        if (idVideoSeleccionado == 0){
+            throw new RuntimeException("El sistema no tiene un video seleccionado");
+        }
+        if (val == null){
+            usuarioSeleccionado.quitarValoracion(idVideoSeleccionado, usuarioActual.getNickname());
+        }else{
+            usuarioSeleccionado.agregarModificarValoracionDeVideo(idVideoSeleccionado, val, usuarioActual);
+        }
     }
     
 }
diff --git a/UyTube_aplicacion/src/Logica/DatosDePrueba.java b/UyTube_aplicacion/src/Logica/DatosDePrueba.java
index abb9de0..3180acb 100644
--- a/UyTube_aplicacion/src/Logica/DatosDePrueba.java
+++ b/UyTube_aplicacion/src/Logica/DatosDePrueba.java
@@ -1,12 +1,16 @@
 package Logica;
 
+import Logica.Clases.Usuario;
 import Logica.Controladores.CAdmin;
+import Logica.Controladores.CUsuario;
 import Logica.Interfaces.IAdmin;
 import Logica.DataType.*;
 import Logica.Enumerados.*;
+import Logica.Interfaces.IUsuario;
 import java.sql.Date;
 import java.sql.Time;
 import java.util.ArrayList;
+import java.util.Map;
 import javax.persistence.EntityManager;
 import javax.persistence.EntityManagerFactory;
 import javax.persistence.Persistence;
@@ -16,6 +20,7 @@ import javax.persistence.Persistence;
  */
 public class DatosDePrueba {
     private static IAdmin sys = null;
+    private static IUsuario sis = null;
     
     public static void main(String[] args) {
         probar();
@@ -24,14 +29,13 @@ public class DatosDePrueba {
     
     private static void probar(){
         Fabrica f = Fabrica.getInstancia();
-        sys = f.getIAdmin();
+        sis = f.getIUsuario();
+        CUsuario su = CUsuario.getInstancia();
         try {
-            
             EntityManagerFactory factory = Persistence.createEntityManagerFactory("UyTubePU");
             EntityManager manager = factory.createEntityManager();
             
             
-            //CAdmin ca = CAdmin.getInstancia();
             
             
             /**
diff --git a/UyTube_aplicacion/src/Logica/Interfaces/IUsuario.java b/UyTube_aplicacion/src/Logica/Interfaces/IUsuario.java
index be8acd9..1e10aff 100644
--- a/UyTube_aplicacion/src/Logica/Interfaces/IUsuario.java
+++ b/UyTube_aplicacion/src/Logica/Interfaces/IUsuario.java
@@ -41,6 +41,7 @@ public interface IUsuario {
 
     /**
      * Da de alta un usuario y su canal a partir de los datos recibidos
+     * Luego de darlo de alta, el usuario queda con la sesión iniciada
      *
      * @param usr Datos del usuario a dar de alta
      * @param canal Datos del canal del usuario
@@ -56,6 +57,7 @@ public interface IUsuario {
 
     /**
      * Da de baja al usuarioActual
+     * En el proceso se cierra la sesion
      */
     public void bajaUsuario();
 
@@ -116,6 +118,21 @@ public interface IUsuario {
      */
     public boolean iniciarSesionUsuario(String nickOEmail, String contrasenia);
 
+    /**
+     * Libera memoria de la lista de reproduccion seleccionada
+     */
+    public void liberarMemoriaListaDeReproduccion();
+
+    /**
+     * Libera memoria del usuario seleccionado
+     */
+    public void liberarMemoriaUsuario();
+
+    /**
+     * Libera memoria del video seleccionado
+     */
+    public void liberarMemoriaVideo();
+
     /**
      * Devuelve todas las categorias existentes en el sistema
      *
-- 
GitLab