Skip to content

Back end repo for our final project for the XVI Full Stack Bootcamp at @KeepCoding, September 2024

Notifications You must be signed in to change notification settings

TheGrootTeam/back_alfa

Repository files navigation

💻 Proyecto InternIT - Backend

🇪🇸 Versión en Español

Tabla de Contenidos

Descripcion

Este repositorio contiene el código del backend de la aplicacion InternIT, una API desarrollada en Node.js y TypeScript para gestionar la comunicación entre empresas y aplicantes para puestos de prácticas. Proporciona una serie de endpoints para la autenticación, gestión de perfiles, ofertas de trabajo y paneles informativos. Además, se utiliza MongoDB como base de datos.

Podras acceder al repositorio de la parte de frontend en este enlace https://github.com/TheGrootTeam/front_alfa

Tecnologías Utilizadas

El backend de esta aplicación está construido con tecnologías modernas que aseguran escalabilidad, seguridad y un desarrollo eficiente. A continuación, se listan las principales tecnologías utilizadas junto con sus versiones:

  • Node.js v22.3.0: Plataforma de ejecución JavaScript en el servidor.
  • TypeScript v5.5.3: Lenguaje de programación que añade tipado estático a JavaScript.
  • Express.js v4.19.2: Framework para Node.js utilizado para crear la API RESTful.
  • MongoDB v6.8.0: Base de datos NoSQL utilizada para almacenar la información de la aplicación.
  • Mongoose v8.5.1: Librería de modelado para MongoDB y Node.js.
  • Jest v29.7.0: Framework de testing utilizado para pruebas unitarias.
  • Swagger v6.2.8: Utilizado para documentar la API.
  • ESLint v8.57.0: Herramienta para la verificación del código, asegurando un código limpio y consistente.
  • Prettier v3.3.3: Formateador de código para mantener una consistencia en el estilo de escritura.
  • dotenv v16.4.5: Utilizado para cargar variables de entorno desde un archivo .env en el proceso de Node.js.
  • Resend: Servicio para gestionar el envío de correos electrónicos en la aplicación.
  • Docker: Tecnología de contenedores utilizada para desplegar la aplicación en distintos entornos.

Documentación Técnica

Puedes encontrar más detalles sobre las tecnologías y módulos utilizados en este proyecto en la siguiente documentación:

Requisitos Previos

Antes de comenzar, asegúrate de tener instalados los siguientes software en tu entorno de desarrollo:

Variables de entorno

  • MONGO_URI=mongodb://127.0.0.1:27017/Ejemplo

  • API_VERSION=version

  • JWT_SECRET=place-here-a-custom-string

  • RESEND_API_KEY=place-here-your-resend-api-key

  • CLIENT_PORT=vite-port

  • FILES_PATH=/usr/src/app/public # para usar en produccion

  • FILES_PATH=src/public # para usar en desarrollo

Instalación y Configuración

Para empezar con el desarrollo de este proyecto, sigue los pasos a continuación:

  1. Clonar el repositorio:

    git clone https://github.com/usuario/back_internit.git
    cd back_internit
  2. Instalar dependencias: Asegúrate de tener Node.js instalado. Luego, ejecuta el siguiente comando:

    npm install
  3. Configurar las variables de entorno: Debes configurar las variables de entorno en un archivo .env en la raíz del proyecto, siguiendo el formato de .env.example. Las variables clave incluyen:

    • MONGODB_URI: La URI de conexión a MongoDB.

    • JWT_SECRET: La clave secreta para el uso de JWT.

    • PORT: El puerto en el que se ejecutará el servidor.

    • RESEND_API_KEY: La clave API para enviar correos electrónicos

    • CLIENT_PORT : El puerto donde escuchará el servidor

    • FILES_PATH=/usr/src/app/public # para usar en produccion

    • FILES_PATH=src/public # para usar en desarrollo

  4. Iniciar la base de datos:

    npm run initDB

Comandos Disponibles

  • Iniciar el servidor de desarrollo:

    npm run dev
  • Compilar el proyecto:

    npm run build
  • Iniciar el servidor en producción:

    npm start
  • Ejecutar pruebas:

    npm run test
  • Linting:

    npm run lint
  • Formatear el código:

    npm run format

Desarrollo

Para iniciar el servidor en modo desarrollo, ejecuta el siguiente comando:

npm run dev

El servidor se iniciará en el puerto especificado en las variables de entorno (por defecto en http://localhost:3000).

Producción

Para construir y ejecutar el servidor en modo producción, sigue estos pasos:

  1. Compila el código:

    npm run build
  2. Inicia el servidor:

    npm start

Endpoints principales:

Autenticación

  • POST /login: Iniciar sesión y obtener un token JWT.
  • POST /register: Registrar un nuevo usuario (empresa o aplicante).

Gestión de Perfiles

  • GET /profile: Obtener el perfil del usuario autenticado.
  • PUT /profile/update: Actualizar la información del perfil.

Gestión de Ofertas

  • GET /offers: Obtener una lista de ofertas de trabajo.
  • POST /offers/new: Crear una nueva oferta de trabajo.
  • PATCH /offers/edit: Editar una oferta de trabajo existente.

Dashboards de Información

  • GET /infoDashboards/:applicantOrCompany: Obtener métricas e información en tiempo real para el tipo de usuario.

Descripcion detallada de los Endpoints

Endpoints

1. Login

POST /login

  • Description: Authenticates a user and returns a token.
  • Request:
  • Response:
    • 200 OK:
      {
        "token": "dsfoig324okjtl24"
      }
    • 401 Unauthorized:
      {
        "error": "wrong password"
      }

2. Register

POST /register

  • Description: Registers a new user.
  • Request:
    • Body:
      {
        "dniCif": "12345678A",
        "password": "password123",
        "isCompany": false,
        "email": "[email protected]"
      }
  • Response:
    • 201 Created:
      {
        "message": "User registered successfully"
      }
    • 400 Bad Request:
      {
        "error": "Invalid input data"
      }

3. Profile Update

PUT /profile/update

  • Description: Updates user profile information.
  • Request:
    • Headers:
      {
        "Authorization": "Bearer <token>"
      }
    • Body:
      {
        "name": "New Name",
        "email": "[email protected]"
      }
  • Response:
    • 200 OK:
      {
        "message": "Profile updated successfully"
      }
    • 400 Bad Request:
      {
        "error": "Invalid input data"
      }

4. Offers

GET /offers

  • Description: Retrieves a list of offers.
  • Response:
    • 200 OK:
      [
        {
          "id": "offer1",
          "title": "Offer Title",
          "description": "Offer Description",
          "price": 100
        },
        ...
      ]

POST /offers/new

  • Description: Creates a new offer.
  • Request:
    • Headers:
      {
        "Authorization": "Bearer <token>"
      }
    • Body:
      {
        "title": "Offer Title",
        "description": "Offer Description",
        "price": 100
      }
  • Response:
    • 201 Created:
      {
        "message": "Offer created successfully"
      }

PATCH /offers/edit

  • Description: Edits an existing offer.
  • Request:
    • Headers:
      {
        "Authorization": "Bearer <token>"
      }
    • Body:
      {
        "id": "offer1",
        "title": "Updated Offer Title",
        "description": "Updated Offer Description",
        "price": 150
      }
  • Response:
    • 200 OK:
      {
        "message": "Offer updated successfully"
      }

5. Info Dashboards

GET /infoDashboards/:applicantOrCompany

  • Description: Retrieves information dashboards based on the type of user (applicant or company).
  • Request:
    • Headers:
      {
        "Authorization": "Bearer <token>"
      }
  • Response:
    • 200 OK:
      {
        "data": [
          {
            "metric": "Some Metric",
            "value": 123
          },
          ...
        ]
      }

Estructura del Proyecto

A continuación, se muestra una visión general de la estructura del proyecto:

.
├── src
│   ├── bin
│   │   └── www.ts             # Punto de entrada de la aplicación
│   ├── controllers            # Controladores de las API
│   │   ├── CreateOfferController.ts
│   │   ├── LoginController.ts
│   │   ├── RegisterController.ts
│   │   ├── EditProfileController.ts
│   ├── middlewares            # Funciones de middleware personalizadas
│   │   └── authJWT.ts
│   ├── models                 # Modelos de MongoDB (Schemas)
│   │   ├── Applicant.ts
│   │   ├── Company.ts
│   │   ├── Offer.ts
│   ├── routes                 # Definición de rutas de la API
│   │   ├── index.ts
│   │   ├── offersRoutes.ts
│   │   ├── loginRoutes.ts
│   │   ├── registerRoutes.ts
│   │   ├── profileRoutes.ts
│   ├── swagger.config.ts      # Configuración de Swagger para la documentación de la API
├── package.json               # Dependencias y scripts del proyecto
└── tsconfig.json              # Configuración de TypeScript

Arquitectura

El backend de esta aplicación sigue una arquitectura modular y escalable, organizada por capas. A continuación, se describen los principales componentes de la arquitectura:

  • Controladores (Controllers): Los controladores manejan las peticiones de la API, procesan los datos y delegan las operaciones de la base de datos a los modelos.
  • Modelos (Models): Los modelos definen la estructura de los datos en MongoDB utilizando Mongoose, lo que permite la interacción directa con la base de datos.
  • Middlewares: Los middlewares se encargan de tareas como la autenticación con JWT, la validación de datos y el manejo de errores.
  • Swagger: La documentación de la API se genera automáticamente utilizando Swagger, lo que facilita el consumo de la API por parte de otros desarrolladores.

Principales capas de la arquitectura:

  1. Capa de Presentación (API): Interactúa con el cliente a través de las peticiones HTTP.
  2. Capa de Negocio (Lógica): Contiene la lógica de negocio que se implementa en los controladores.
  3. Capa de Persistencia (Base de Datos): Gestión y manipulación de datos en MongoDB a través de los modelos de Mongoose.

Uso de Docker

Este proyecto incluye un archivo Dockerfile que permite construir y desplegar la aplicación en un entorno de contenedores.

Construcción de la imagen Docker:

docker build -t back_internit .

Ejecución del contenedor Docker:

docker run -p 3000:3000 back_internit

El servidor estará disponible en http://localhost:3000.

Estado del Proyecto

Este proyecto está en desarrollo activo. Próximas características incluyen mejoras en la documentación de la API y optimizaciones en el manejo de grandes volúmenes de datos.

Colaboradores del Proyecto

Este proyecto ha sido desarrollado en su totalidad por el equipo The Goot Team, en el marco del Bootcamp de Desarrollo Web Fullstack (Edición XVI de la escuela KeepCoding).

Contribuciones

Para contribuir a este proyecto:

  1. Realiza un fork del repositorio.
  2. Crea una nueva rama (git checkout -b feature/nueva-funcionalidad).
  3. Realiza tus cambios y haz commit (git commit -m 'Añadir nueva funcionalidad').
  4. Sube los cambios a tu repositorio (git push origin feature/nueva-funcionalidad).
  5. Abre un Pull Request para revisión.

Licencia

Este proyecto está licenciado bajo la Licencia MIT. Consulta el archivo LICENSE para obtener más detalles.


💻 InternIT Project - Backend

🇬🇧 English Version

Table of Contents

Description

This repository contains the backend code for the InternIT application, an API developed in Node.js and TypeScript to manage communication between companies and job applicants. It provides a set of endpoints for authentication, profile management, job offers, and information dashboards. In addition, MongoDB is used as the database.

You can access the repository of the frontend part in this link https://github.com/thegrootteam/front_alfa

Technologies Used

The backend of this application is built with modern technologies that ensure scalability, security, and efficient development. Below is a list of the main technologies used along with their versions:

  • Node.js v22.3.0: JavaScript runtime platform on the server.
  • TypeScript v5.5.3: Programming language that adds static typing to JavaScript.
  • Express.js v4.19.2: Framework for Node.js used to create the RESTful API.
  • MongoDB v6.8.0: NoSQL database used to store application data.
  • Mongoose v8.5.1: Modeling library for MongoDB and Node.js.
  • Jest v29.7.0: Testing framework used for unit tests.
  • Swagger v6.2.8: Used to document the API.
  • ESLint v8.57.0: Code verification tool, ensuring clean and consistent code.
  • Prettier v3.3.3: Code formatter to maintain consistency in code style.
  • dotenv v16.4.5: Used to load environment variables from a .env file in Node.js processes.
  • Docker: Container technology used to deploy the application in different environments.

Technical Documentation

You can find more details about the technologies and modules used in this project in the following documentation:

Prerequisites

Before starting, make sure you have the following software installed in your development environment:

Variables de entorno

  • MONGO_URI=mongodb://127.0.0.1:27017/Ejemplo

  • API_VERSION=version

  • JWT_SECRET=place-here-a-custom-string

  • RESEND_API_KEY=place-here-your-resend-api-key

  • CLIENT_PORT=vite-port

  • FILES_PATH=/usr/src/app/public # to use in production

  • FILES_PATH=src/public # to use in development

Installation and Setup

To start development on this project, follow the steps below:

  1. Clone the repository:

    git clone https://github.com/usuario/back_internit.git
    cd back_internit
  2. Install dependencies: Make sure Node.js is installed. Then, run the following command:

    npm install
  3. Set up environment variables: You need to configure environment variables in a .env file in the root of the project, following the format of .env.example. The key variables include:

    • MONGODB_URI: MongoDB connection URI.

    • JWT_SECRET: The secret key for using JWT.

    • PORT: The port where the server will run.

    • RESEND_API_KEY: The API key for sending emails

    • CLIENT_PORT : The port where the server will listen

    • FILES_PATH: /usr/src/app/public # to use in production

    • FILES_PATH: /src/public # to use in development

  4. Initialize the database:

    npm run initDB

Available Commands

  • Start the development server:

    npm run dev
  • Compile the project:

    npm run build
  • Start the production server:

    npm start
  • Run tests:

    npm run test
  • Lint the code:

    npm run lint
  • Format the code:

    npm run format

Development

To start the server in development mode, run the following command:

npm run dev

The server will start on the port specified in the environment variables (default is http://localhost:3000).

Production

To build and start the server in production mode, follow these steps:

  1. Compile the code:

    npm run build
  2. Start the server:

    npm start

Main Endpoints:

Authentication

  • POST /login: Log in and obtain a JWT token.
  • POST /register: Register a new user (company or applicant).

Profile Management

  • GET /profile: Get the profile of the authenticated user.
  • PUT /profile/update: Update profile information.

Job Offer Management

  • GET /offers: Get a list of job offers.
  • POST /offers/new: Create a new job offer.
  • PATCH /offers/edit: Edit an existing job offer.

Information Dashboards

  • GET /infoDashboards/:applicantOrCompany: Get real-time metrics and information for the type of user.

Detailed Endpoint Descriptions

Endpoints

1. Login

POST /login

  • Description: Authenticates a user and returns a token.
  • Request:
  • Response:
    • 200 OK:
      {
        "token": "dsfoig324okjtl24"
      }
    • 401 Unauthorized:
      {
        "error": "wrong password"
      }

2. Register

POST /register

  • Description: Registers a new user.
  • Request:
    • Body:
      {
        "dniCif": "12345678A",
        "password": "password123",
        "isCompany": false,
        "email
      

": "[email protected]" } ```

  • Response:
    • 201 Created:
      {
        "message": "User registered successfully"
      }
    • 400 Bad Request:
      {
        "error": "Invalid input data"
      }

3. Profile Update

PUT /profile/update

  • Description: Updates user profile information.
  • Request:
    • Headers:
      {
        "Authorization": "Bearer <token>"
      }
    • Body:
      {
        "name": "New Name",
        "email": "[email protected]"
      }
  • Response:
    • 200 OK:
      {
        "message": "Profile updated successfully"
      }
    • 400 Bad Request:
      {
        "error": "Invalid input data"
      }

4. Offers

GET /offers

  • Description: Retrieves a list of offers.
  • Response:
    • 200 OK:
      [
        {
          "id": "offer1",
          "title": "Offer Title",
          "description": "Offer Description",
          "price": 100
        },
        ...
      ]

POST /offers/new

  • Description: Creates a new offer.
  • Request:
    • Headers:
      {
        "Authorization": "Bearer <token>"
      }
    • Body:
      {
        "title": "Offer Title",
        "description": "Offer Description",
        "price": 100
      }
  • Response:
    • 201 Created:
      {
        "message": "Offer created successfully"
      }

PATCH /offers/edit

  • Description: Edits an existing offer.
  • Request:
    • Headers:
      {
        "Authorization": "Bearer <token>"
      }
    • Body:
      {
        "id": "offer1",
        "title": "Updated Offer Title",
        "description": "Updated Offer Description",
        "price": 150
      }
  • Response:
    • 200 OK:
      {
        "message": "Offer updated successfully"
      }

5. Info Dashboards

GET /infoDashboards/:applicantOrCompany

  • Description: Retrieves information dashboards based on the type of user (applicant or company).
  • Request:
    • Headers:
      {
        "Authorization": "Bearer <token>"
      }
  • Response:
    • 200 OK:
      {
        "data": [
          {
            "metric": "Some Metric",
            "value": 123
          },
          ...
        ]
      }

Project Structure

Below is an overview of the project structure:

.
├── src
│   ├── bin
│   │   └── www.ts             # Application entry point
│   ├── controllers            # API controllers
│   │   ├── CreateOfferController.ts
│   │   ├── LoginController.ts
│   │   ├── RegisterController.ts
│   │   ├── EditProfileController.ts
│   ├── middlewares            # Custom middleware functions
│   │   └── authJWT.ts
│   ├── models                 # MongoDB Models (Schemas)
│   │   ├── Applicant.ts
│   │   ├── Company.ts
│   │   ├── Offer.ts
│   ├── routes                 # API route definitions
│   │   ├── index.ts
│   │   ├── offersRoutes.ts
│   │   ├── loginRoutes.ts
│   │   ├── registerRoutes.ts
│   │   ├── profileRoutes.ts
│   ├── swagger.config.ts      # Swagger configuration for API documentation
├── package.json               # Project dependencies and scripts
└── tsconfig.json              # TypeScript configuration

Architecture

The backend of this application follows a modular and scalable architecture, organized into layers. Below are the main components of the architecture:

  • Controllers: Handle API requests, process data, and delegate database operations to models.
  • Models: Define the data structure in MongoDB using Mongoose, allowing direct interaction with the database.
  • Middlewares: Responsible for tasks such as JWT authentication, data validation, and error handling.
  • Swagger: Automatically generates API documentation using Swagger, facilitating API consumption by other developers.

Main Layers of the Architecture:

  1. Presentation Layer (API): Interacts with the client through HTTP requests.
  2. Business Layer (Logic): Contains the business logic implemented in the controllers.
  3. Persistence Layer (Database): Manages and manipulates data in MongoDB through Mongoose models.

Using Docker

This project includes a Dockerfile that allows you to build and deploy the application in a containerized environment.

Building the Docker Image:

docker build -t back_internit .

Running the Docker Container:

docker run -p 3000:3000 back_internit

The server will be available at http://localhost:3000.

Project Status

This project is in active development. Upcoming features include improvements to API documentation and optimizations for handling large volumes of data.

Project Contributors

This project was developed entirely by the The Goot Team, as part of the Fullstack Web Development Bootcamp (16th Edition) at KeepCoding.

Contributions

To contribute to this project:

  1. Fork the repository.
  2. Create a new branch (git checkout -b feature/new-feature).
  3. Make your changes and commit them (git commit -m 'Add new feature').
  4. Push the changes to your repository (git push origin feature/new-feature).
  5. Open a Pull Request for review.

License

This project is licensed under the MIT License. See the LICENSE file for more details.

About

Back end repo for our final project for the XVI Full Stack Bootcamp at @KeepCoding, September 2024

Resources

Stars

Watchers

Forks

Packages

No packages published