<file_sep>﻿using System;
using System.Collections.Generic;

namespace agenda
{
    public class Program
    {
        public static void Main(String[] args)
        {
            ConectionMYSQL baseDeDatos = new ConectionMYSQL();
            bool programaActivo = true;

            do
            {
                Console.WriteLine("Selecciona lo que deseas hacer: \n1 - Mostrar agenda\n2 - Registrar nuevo contacto\n3 - Eliminar contacto\n4 - Editar contacto\n5 - Salir del programa");
                int opcionSeleccionada = int.Parse(Console.ReadLine());

                switch (opcionSeleccionada)
                {
                    case 1:
                        List<Contacto> listaDeContactos = baseDeDatos.ObtenerContactos();
                        
                        foreach (Contacto contacto in listaDeContactos)
                        {
                            Console.WriteLine("Nombre: " + contacto.Nombre);
                            Console.WriteLine("Correo electronico: " + contacto.Correo);
                            Console.WriteLine("Numero de telefono: " + contacto.Telefono);
                            Console.WriteLine("=============================");
                        }

                    break;

                    case 2:
                        Contacto nuevoContacto = new Contacto();

                        Console.WriteLine("\nIngresa el nombre de tu nuevo contacto");
                        nuevoContacto.Nombre = Console.ReadLine();

                        Console.WriteLine("\nIngresa el correo de tu nuevo contacto");
                        nuevoContacto.Correo = Console.ReadLine();

                        Console.WriteLine("\nIngresa el telefono de tu nuevo contacto");
                        nuevoContacto.Telefono = Console.ReadLine();

                        if (baseDeDatos.RegistrarContacto(nuevoContacto))
                        {
                            Console.WriteLine("\n===Registro exitoso===\n");
                        }else{
                            Console.WriteLine("Ocurrio un error durante el registro, intente de nuevo");
                        }

                    break;

                    case 3:
                        Console.WriteLine("\nIngresa el nombre del contacto a eliminar");
                        string nombreDeContacto = Console.ReadLine();

                        if (baseDeDatos.EliminarContacto(nombreDeContacto))
                        {
                            Console.WriteLine("\n===Eliminación exitosa===");
                        }else{
                            Console.WriteLine("\n===Ocurrio un error durante la eliminación===");
                        }

                    break;

                    case 4:
                        List<Contacto> contactos = baseDeDatos.ObtenerContactos();
                        foreach (Contacto contacto in contactos)
                        {
                            Console.WriteLine("- " + contacto.Nombre);
                        }
                        
                        Console.WriteLine("Escribe el nombre del contacto a editar");
                        string nombreContacto = Console.ReadLine();

                        Console.WriteLine("¿Qué información deseas actualizar?\n1 - Correo\n2 - Telefono");
                        int infoAActualizar = int.Parse(Console.ReadLine());

                        switch (infoAActualizar)
                        {
                            case 1:
                                Console.WriteLine("\n===Ingresa el nuevo correo===\n");
                                string nuevoCorreo = Console.ReadLine();
                                if (baseDeDatos.ActualizarCorreo(nombreContacto,nuevoCorreo))
                                {
                                    Console.WriteLine("\n===Aactualización exitosa===\n");
                                }else{
                                    Console.WriteLine("\n===Ocurrio un error durante la actualización===\n");
                                }
                            break;
                            
                            case 2:
                                Console.WriteLine("\n===Ingresa el nuevo telefono===\n");
                                string nuevoTelefono = Console.ReadLine();
                                if (baseDeDatos.ActualizarTelefono(nombreContacto, nuevoTelefono))
                                {
                                    Console.WriteLine("\n===Aactualización exitosa===\n");
                                }else{
                                    Console.WriteLine("\n===Ocurrio un error durante la actualización===\n");
                                }
                            break;
                            
                            default:
                                Console.WriteLine("\n===Selecciona una opcion valida===\n");   
                            break;
                        }
                    break;

                    case 5:
                        programaActivo = false;
                    break;

                    default:
                        Console.WriteLine("\n===Selecciona una opcion valida===\n");
                    break;
                }

            } while(programaActivo);
        }
    }
}<file_sep>namespace agenda
{
    public class Contacto
    {
        public string Nombre { get; set; }
        public string Correo { get; set; }
        public string Telefono { get; set; }
    }
}<file_sep>version: '3.9'

services:
    bd-agenda:
        image: mysql/mysql-server:latest
        container_name: contenedor-bd
        ports:
            - "8080:3306"
        restart: always
        volumes:
            - volumen-agenda:/var/lib/mysql
            - ./bd/agenda.sql:/docker-entrypoint-initdb.d/agenda.sql:ro
        command: ['mysqld', '--character-set-server=utf8mb4', '--collation-server=utf8mb4_0900_ai_ci']
        environment: 
            MYSQL_ROOT_PASSWORD: "root"
            MYSQL_HOST: localhost
            MYSQL_DATABASE: "Agenda"
            MYSQL_USER: "root"
        
    app-agenda:
        image: app-agenda
        container_name: contenedor-agenda
        build:
            context: ./agenda/
            dockerfile: Dockerfile
        stdin_open: true 
        tty: true       
        depends_on: 
            - "bd-agenda"
        environment: 
            DB_CONNECTION_STRING: "server=bd-agenda;user=admin;password=<PASSWORD>;database=Agenda"
volumes:
    volumen-agenda:<file_sep>FROM mcr.microsoft.com/dotnet/aspnet:5.0-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:5.0-buster-slim AS build
WORKDIR /src
COPY ["agenda.csproj", "./"]
RUN dotnet restore "agenda.csproj"
COPY . .
WORKDIR "/src/"
RUN dotnet build "agenda.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "agenda.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
# ENTRYPOINT ["dotnet", "agenda.dll"]<file_sep>-- MySQL Script generated by MySQL Workbench
-- Thu Mar  4 14:13:37 2021
-- Model: New Model    Version: 1.0
-- MySQL Workbench Forward Engineering

SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0;
SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0;
SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';

-- -----------------------------------------------------
-- Schema Agenda
-- -----------------------------------------------------

-- -----------------------------------------------------
-- Schema Agenda
-- -----------------------------------------------------
CREATE SCHEMA IF NOT EXISTS `Agenda` DEFAULT CHARACTER SET utf8 ;
USE `Agenda` ;

-- -----------------------------------------------------
-- Table `Agenda`.`Persona`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Agenda`.`Persona` (
  `idPersona` INT NOT NULL AUTO_INCREMENT,
  `Nombre` VARCHAR(45) NULL,
  PRIMARY KEY (`idPersona`))
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `Agenda`.`Telefono`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Agenda`.`Telefono` (
  `idTelefono` INT NOT NULL AUTO_INCREMENT,
  `Numero` VARCHAR(45) NULL,
  `Persona_idPersona` INT NOT NULL,
  PRIMARY KEY (`idTelefono`),
  INDEX `fk_Telefono_Persona1_idx` (`Persona_idPersona` ASC) VISIBLE,
  CONSTRAINT `fk_Telefono_Persona1`
    FOREIGN KEY (`Persona_idPersona`)
    REFERENCES `Agenda`.`Persona` (`idPersona`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;


-- -----------------------------------------------------
-- Table `Agenda`.`Correo`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `Agenda`.`Correo` (
  `idCorreo` INT NOT NULL AUTO_INCREMENT,
  `Correo` VARCHAR(45) NULL,
  `Persona_idPersona` INT NOT NULL,
  PRIMARY KEY (`idCorreo`),
  INDEX `fk_Correo_Persona_idx` (`Persona_idPersona` ASC) VISIBLE,
  CONSTRAINT `fk_Correo_Persona`
    FOREIGN KEY (`Persona_idPersona`)
    REFERENCES `Agenda`.`Persona` (`idPersona`)
    ON DELETE NO ACTION
    ON UPDATE NO ACTION)
ENGINE = InnoDB;

-- -----------------------------------------------------
-- Data for table `inventario`.`Persona`
-- -----------------------------------------------------
START TRANSACTION;
USE `Agenda`;
INSERT INTO `Agenda`.`Persona` (`nombre`) VALUES ('Angel');
INSERT INTO `Agenda`.`Persona` (`nombre`) VALUES ('Mario');
INSERT INTO `Agenda`.`Persona` (`nombre`) VALUES ('Carlos');
INSERT INTO `Agenda`.`Persona` (`nombre`) VALUES ('Sandra');
INSERT INTO `Agenda`.`Persona` (`nombre`) VALUES ('Laura');
INSERT INTO `Agenda`.`Persona` (`nombre`) VALUES ('Zaira');

COMMIT;

-- -----------------------------------------------------
-- Data for table `inventario`.`Telefono`
-- -----------------------------------------------------
START TRANSACTION;
USE `Agenda`;
INSERT INTO `Agenda`.`Telefono` (`numero`,`Persona_idPersona`) VALUES ('2281819155', '1');
INSERT INTO `Agenda`.`Telefono` (`numero`,`Persona_idPersona`) VALUES ('2281915584', '2');
INSERT INTO `Agenda`.`Telefono` (`numero`,`Persona_idPersona`) VALUES ('2281365978', '3');
INSERT INTO `Agenda`.`Telefono` (`numero`,`Persona_idPersona`) VALUES ('2282456785', '4');
INSERT INTO `Agenda`.`Telefono` (`numero`,`Persona_idPersona`) VALUES ('1258745668', '5');
INSERT INTO `Agenda`.`Telefono` (`numero`,`Persona_idPersona`) VALUES ('2286597845', '6');

COMMIT;

-- -----------------------------------------------------
-- Data for table `inventario`.`Correo`
-- -----------------------------------------------------
START TRANSACTION;
USE `Agenda`;
INSERT INTO `Agenda`.`Correo` (`Correo`,`Persona_idPersona`) VALUES ('<EMAIL>', '1');
INSERT INTO `Agenda`.`Correo` (`Correo`,`Persona_idPersona`) VALUES ('<EMAIL>', '2');
INSERT INTO `Agenda`.`Correo` (`Correo`,`Persona_idPersona`) VALUES ('<EMAIL>', '3');
INSERT INTO `Agenda`.`Correo` (`Correo`,`Persona_idPersona`) VALUES ('<EMAIL>', '4');
INSERT INTO `Agenda`.`Correo` (`Correo`,`Persona_idPersona`) VALUES ('<EMAIL>', '5');
INSERT INTO `Agenda`.`Correo` (`Correo`,`Persona_idPersona`) VALUES ('<EMAIL>', '6');

COMMIT;

-- SET SQL_MODE = '';
-- DROP USER IF EXISTS admin;
SET SQL_MODE='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION';
CREATE USER 'admin' IDENTIFIED BY 'admin';
GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;

SET SQL_MODE=@OLD_SQL_MODE;
SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS;
SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS;<file_sep>using System;
using System.Collections.Generic;
using System.Threading.Tasks;
using MySqlConnector;

namespace agenda
{
    public class ConectionMYSQL
    {
        private String connectionString;
        private MySqlConnection conexion;
        private string ID_PERSONA_ERROR = "0";

        public ConectionMYSQL(){
            connectionString = Environment.GetEnvironmentVariable("DB_CONNECTION_STRING");
            conexion = new MySqlConnection(connectionString);
        }

        public List<Contacto> ObtenerContactos(){

            List<Contacto> listaDeContactos = new List<Contacto>();

            try
            {
                conexion.Open();
                var comando = new MySqlCommand("SELECT Nombre,Numero,Correo FROM Persona,Telefono,Correo WHERE Persona.idPersona = Telefono.Persona_idPersona AND Persona.idPersona = Correo.Persona_idPersona;", conexion);
                var reader = comando.ExecuteReader();

                while (reader.Read())
                {
                    Contacto contactoObtenido = new Contacto();
                    contactoObtenido.Nombre = reader.GetString(0);
                    contactoObtenido.Telefono = reader.GetString(1);
                    contactoObtenido.Correo = reader.GetString(2);

                    listaDeContactos.Add(contactoObtenido);
                }
            }
            catch (Exception error)
            {
                System.Console.WriteLine("Ocurrio un error: " + error.Message);

            }finally{
                conexion.Close();
            }

            return listaDeContactos;
        }

        public bool RegistrarContacto(Contacto nuevoContacto){
            bool registroExitoso = false;
            
            if (RegistrarNombre(nuevoContacto.Nombre))
            {
                string idPersona = ObtenerId(nuevoContacto.Nombre);

                if (RegistrarCorreo(nuevoContacto.Correo, idPersona) && RegistrarTelefono(nuevoContacto.Telefono, idPersona))
                {
                    registroExitoso = true;
                }
            }

            return registroExitoso;
        }

        public bool EliminarContacto(string nombreContacto){
            bool eliminacionExitosa = false;
            string idContacto = ObtenerId(nombreContacto);

            if(EliminarTelefono(idContacto) && EliminarCorreo(idContacto) && EliminarNombre(idContacto)){
                eliminacionExitosa = true;
            }

            return eliminacionExitosa;
        }

        public bool ActualizarCorreo(string nombreContacto, string nuevoCorreo){
            bool actualizacionExitosa = false;
            string idPersona = ObtenerId(nombreContacto);

            try
            {
                conexion.Open();

                var registroPersona = new MySqlCommand($"UPDATE Correo SET Correo = '{nuevoCorreo}' WHERE Persona_idPersona='{idPersona}'", conexion);
                registroPersona.ExecuteNonQuery();

                actualizacionExitosa = true;

            } catch(Exception error){
                Console.WriteLine("Ocurrió un error (Método ActualizarCorreo): " + error.Message);
            }finally{
                conexion.Close();
            }

            return actualizacionExitosa;
        }

        public bool ActualizarTelefono(string nombreContacto, string nuevoTelefono){
            bool actualizacionExitosa = false;
            string idPersona = ObtenerId(nombreContacto);

            try
            {
                conexion.Open();

                var registroPersona = new MySqlCommand($"UPDATE Telefono SET Numero = '{nuevoTelefono}' WHERE Persona_idPersona='{idPersona}'", conexion);
                registroPersona.ExecuteNonQuery();

                actualizacionExitosa = true;

            } catch(Exception error){
                Console.WriteLine("Ocurrió un error (Método ActualizarTelefono): " + error.Message);
            }finally{
                conexion.Close();
            }

            return actualizacionExitosa;
        }


        //METODOS PRIVADOS PARA REALIZAR LAS INSERCIONES DE DATOS

        private bool RegistrarNombre(string nombre){
            bool registroExitoso = false;

            try
            {
                conexion.Open();

                var registroPersona = new MySqlCommand($"INSERT INTO Persona(Nombre) VALUES ('{nombre}');", conexion);
                registroPersona.ExecuteNonQuery();

                registroExitoso = true;

            } catch(Exception error){
                Console.WriteLine("Ocurrió un error (Método RegistrarNombre): " + error.Message);
            }finally{
                conexion.Close();
            }

            return registroExitoso;
        } 
        private bool EliminarNombre(string idPersona){
            bool eliminacionExitosa = false;
            try
            {
                conexion.Open();

                var comandoEliminar = new MySqlCommand($"DELETE FROM Persona WHERE idPersona='{idPersona}';", conexion);
                comandoEliminar.ExecuteNonQuery();

                eliminacionExitosa = true;

            } catch(Exception error){
                Console.WriteLine("Ocurrió un error (Método EliminarNombre): " + error.Message);
            }finally{
                conexion.Close();
            }
            return eliminacionExitosa;
        }
        
        private bool RegistrarCorreo(string correo, string idPersona){
            bool registroExitoso = false;

            try
            {
                conexion.Open();

                var registroCorreo = new MySqlCommand($"INSERT INTO Correo(Correo,Persona_idPersona) VALUES ('{correo}','{idPersona}');", conexion);
                registroCorreo.ExecuteNonQuery();

                registroExitoso = true;

            } catch(Exception error){
                Console.WriteLine("Ocurrió un error (Método RegistrarCorreo): " + error.Message);
            }finally{
                conexion.Close();
            }

            return registroExitoso;
        } 
        private bool EliminarCorreo(string idPersona){
            bool eliminacionExitosa = false;
            try
            {
                conexion.Open();

                var comandoEliminar = new MySqlCommand($"DELETE FROM Correo WHERE Persona_idPersona='{idPersona}';", conexion);
                comandoEliminar.ExecuteNonQuery();

                eliminacionExitosa = true;

            } catch(Exception error){
                Console.WriteLine("Ocurrió un error (Método EliminarCorreo): " + error.Message);
            }finally{
                conexion.Close();
            }
            return eliminacionExitosa;
        }

        private bool RegistrarTelefono(string telefono, string idPersona){
            bool registroExitoso = false;

            try
            {
                conexion.Open();

                var registroTelefono = new MySqlCommand($"INSERT INTO Telefono(Numero,Persona_idPersona) VALUES ('{telefono}','{idPersona}');", conexion);
                registroTelefono.ExecuteNonQuery();

                registroExitoso = true;

            } catch(Exception error){
                Console.WriteLine("Ocurrió un error (Método RegistrarTelefono): " + error.Message);
            }finally{
                conexion.Close();
            }

            return registroExitoso;
        } 
        private bool EliminarTelefono(string idPersona){
            bool eliminacionExitosa = false;
            try
            {
                conexion.Open();

                var comandoEliminar = new MySqlCommand($"DELETE FROM Telefono WHERE Persona_idPersona='{idPersona}';", conexion);
                comandoEliminar.ExecuteNonQuery();

                eliminacionExitosa = true;

            } catch(Exception error){
                Console.WriteLine("Ocurrió un error (Método EliminarCorreo): " + error.Message);
            }finally{
                conexion.Close();
            }
            return eliminacionExitosa;
        }

        private string ObtenerId(string nombreContacto){
            string idObtenido = ID_PERSONA_ERROR;
            try
            {
                conexion.Open();
                var command = new MySqlCommand($"SELECT idPersona FROM Persona WHERE Nombre = '{nombreContacto}'", conexion);
                var reader = command.ExecuteReader();
                
                while (reader.Read())
                {
                    idObtenido = reader.GetInt32(0).ToString();
                }

            }catch(Exception error){
                Console.WriteLine("Ocurrió un error (Método ObtenerId)" +  error.Message);
            }finally{
                conexion.Close();
            }

            return idObtenido;
        }
    }
}