Commit 793dc749 authored by guillecxb's avatar guillecxb
Browse files

update user features and add build and push script

parent 6c86cda2
Loading
Loading
Loading
Loading

build_and_push.sh

0 → 100755
+97 −0
Original line number Diff line number Diff line
#!/bin/bash

set -e  # Detener la ejecución si ocurre un error

# Función para manejar errores
handle_error() {
    echo "Error en el script. Línea: $1"
    exit 1
}

# Capturar errores y llamar a la función handle_error
trap 'handle_error $LINENO' ERR

# Pedir al usuario la URL del backend
read -p "Introduce la URL del backend (ej. http://localhost:8085): " BACKEND_URL

# Concatenar "/api" al final de la URL
API_URL="${BACKEND_URL}/api"

echo "La URL completa de la API será: $API_URL"

# Cambiar el valor de NEXT_PUBLIC_API_BASE_URL en el archivo capif_frontend/.env
ENV_FILE="capif_frontend/.env"

if [ -f "$ENV_FILE" ]; then
    # Reemplazar la línea correcta sin tocar las comentadas o con espacios alrededor del igual
    sed -i '' -E 's|^NEXT_PUBLIC_API_BASE_URL\s*=\s*.*$|NEXT_PUBLIC_API_BASE_URL="'"$API_URL"'"|g' "$ENV_FILE"
    echo "Variable NEXT_PUBLIC_API_BASE_URL actualizada en $ENV_FILE"
else
    echo "Error: No se encontró el archivo $ENV_FILE"
    exit 1
fi

# Obtener la última versión desde ECR usando AWS CLI
LAST_VERSION=$(aws ecr-public describe-image-tags --repository-name opencapif/backoffice-frontend --region us-east-1 --query 'imageTagDetails[*].imageTag' --output text | grep -Eo 'v3.1.[0-9]+' | sed 's/v3.1.//' | sort -n | tail -1)

if [ -z "$LAST_VERSION" ]; then
    echo "No se pudo obtener la última versión desde ECR. Verifica si el repositorio o las imágenes existen."
    exit 1
fi

# Incrementar la versión
NEW_VERSION=$((LAST_VERSION + 1))
echo "Nueva versión: v3.1.$NEW_VERSION"

# Cambiar directorio a capif_frontend
echo "Cambiando a directorio capif_frontend..."
cd capif_frontend || { echo "Error: no se pudo cambiar al directorio capif_frontend."; exit 1; }

# Ejecutar comandos de yarn
echo "Instalando dependencias con yarn..."
yarn install || { echo "Error en 'yarn install'."; exit 1; }

echo "Construyendo la aplicación con yarn..."
yarn build || { echo "Error en 'yarn build'."; exit 1; }

echo "Exportando la aplicación con yarn..."
yarn export || { echo "Error en 'yarn export'."; exit 1; }

# Volver al directorio principal
cd .. || { echo "Error: no se pudo volver al directorio principal."; exit 1; }

# Establecer la plataforma y construir la imagen Docker
echo "Construyendo la imagen Docker..."
DOCKER_DEFAULT_PLATFORM=linux/amd64 docker-compose build || { echo "Error en la construcción de la imagen Docker."; exit 1; }

# Autenticación MFA con AWS para obtener un token temporal
read -p "Introduce el código MFA de 6 dígitos: " MFA_CODE

# Obtener un token temporal usando MFA
echo "Autenticando con AWS usando MFA..."
MFA_ARN="arn:aws:iam::230970400116:mfa/authentication_iphone"  # Cambia esto si el ARN de tu dispositivo MFA es diferente
TEMP_CREDS=$(aws sts get-session-token --serial-number "$MFA_ARN" --token-code "$MFA_CODE" --output json)

if [ -z "$TEMP_CREDS" ]; then
    echo "Error: No se pudo obtener el token temporal de AWS. Verifica el código MFA."
    exit 1
fi

# Exportar credenciales temporales
export AWS_ACCESS_KEY_ID=$(echo "$TEMP_CREDS" | jq -r '.Credentials.AccessKeyId')
export AWS_SECRET_ACCESS_KEY=$(echo "$TEMP_CREDS" | jq -r '.Credentials.SecretAccessKey')
export AWS_SESSION_TOKEN=$(echo "$TEMP_CREDS" | jq -r '.Credentials.SessionToken')

# Autenticar Docker con Amazon ECR Public
aws ecr-public get-login-password --region us-east-1 | docker login --username AWS --password-stdin public.ecr.aws/o2v4a8t6 || { echo "Error en la autenticación con Docker."; exit 1; }

# Taggear la imagen con la nueva versión
echo "Etiquetando la imagen Docker..."
docker tag pesp_capif_backoffice_frontend_v2-frontend_microservice public.ecr.aws/o2v4a8t6/opencapif/backoffice-frontend:v3.1.$NEW_VERSION || { echo "Error al etiquetar la imagen Docker."; exit 1; }

# Push de la imagen con la nueva versión
echo "Pushing la nueva imagen a ECR..."
docker push public.ecr.aws/o2v4a8t6/opencapif/backoffice-frontend:v3.1.$NEW_VERSION || { echo "Error al hacer push de la imagen Docker."; exit 1; }

# Mostrar la nueva versión
echo "Nueva imagen subida correctamente: public.ecr.aws/o2v4a8t6/opencapif/backoffice-frontend:v3.1.$NEW_VERSION"
+12 −0
Original line number Diff line number Diff line
NEXT_PUBLIC_JWT_EXPIRATION=5m
NEXT_PUBLIC_JWT_SECRET=dd5f3089-40c3-403d-af14-d0c228b05cb4
NEXT_PUBLIC_JWT_REFRESH_TOKEN_SECRET=7c4c1c50-3230-45bf-9eae-c9b2e401c767

# Old capif
# NEXT_PUBLIC_API_BASE_URL="https://backoffice-api.mobilesandbox.cloud:38443"

# Local environment
# NEXT_PUBLIC_API_BASE_URL="http://localhost:8085/api"

# UMA capif
# NEXT_PUBLIC_API_BASE_URL="https://backoffice.6gsandbox.uma.internal/api"

# Peñuelas capif
# NEXT_PUBLIC_API_BASE_URL="https://backoffice.mobilesandbox.cloud:38443/api"

NEXT_PUBLIC_API_BASE_URL="https://backoffice.mobilesandbox.cloud:38443/api"

NEXT_PUBLIC_GRAFANA_BASE_URL="https://grafana.5gnacar.int"
NODE_ENV=development
+45 −3
Original line number Diff line number Diff line
@@ -203,9 +203,51 @@ export const getUsersPagesOrder = async ({ page, pageSize, order }) => {
  }
}

export const getUser = async name => {
  return axiosInstance.get(`/users/${name}`)
export const getInvokersByUuid = async (uuid) => {
  try {
    const response = await axiosInstance.get(`/invokers/user`, {
      params: {
        uuid: uuid
      }
    });
    
    return response.data;
  } catch (error) {
    throw new Error(`Error fetching invokers of a user: ${error.message}`);
  }
}

export const getProvidersByUuid = async (uuid) => {
  try {
    const response = await axiosInstance.get(`/providers/user`, {
      params: {
        uuid: uuid
      }
    });
    
    return response.data;
  } catch (error) {
    throw new Error(`Error fetching providers of a user: ${error.message}`);
  }
}

export const getUser = async (uuid) => {
  try {
    const response = await axiosInstance.get(`/users/info`, {
      params: {
        uuid: uuid
      }
    });
    
    return response.data;
  } catch (error) {
    throw new Error(`Error fetching user information: ${error.message}`);
  }
}

// export const getUser = async name => {
//   return axiosInstance.get(`/users/${name}`)
// }

export const getNumUsers1 = async () => {
  return axiosInstance.get(`/users/numUsers`)
@@ -238,7 +280,7 @@ export const deleteUsers = async (uuids) => {
export const createUser = async (userData) => {
  try {
    // Haz la solicitud POST con axios
    const response = await axiosInstance.post('/user', userData, {
    const response = await axiosInstance.post('/users/', userData, {
      headers: {
        'Content-Type': 'application/json'
      },
+6 −1
Original line number Diff line number Diff line
import axios from 'axios'
import { getAccessToken, getRefreshToken, setAccessToken } from './cookies'
import authConfig from 'src/configs/auth'
import { useRouter } from 'next/router'

const DEBUG_SHOW_DATA = true

@@ -69,9 +70,12 @@ axiosInstance.interceptors.response.use(

  // try to refresh token if 401 error
  async error => {
    const router = useRouter()
    console.error('🔴 RESPONSE ERROR: ', error.message)
    console.log('Al dar 401 entra por aqui')

    //console.log('2 accessToken', accessToken)
    console.log('Redirigiendo al login...')
    router.push('/login')

    if (
      error.response &&
@@ -80,6 +84,7 @@ axiosInstance.interceptors.response.use(
      error.response.config.url !== '/api/refresh'
    ) {
      // try to refresh token
      console.log('Intenta refrescar el token')
      const refreshToken = getRefreshToken()
      if (refreshToken) {
        try {
+14 −6
Original line number Diff line number Diff line
@@ -49,16 +49,16 @@ const AuthProvider = ({ children }) => {
  // useEffect -> hook de react que se ejecuta cuando el componente se monta, 1 VEZ
  useEffect(() => {
    const initAuth = async () => {
      //console.log('Entró por initAuth')
      console.log('Entró por initAuth')
      const storedAccessToken = getAccessToken()  // obtiene el token de acceso almacenado en las cookies
      
      //console.log('storedAccessToken: ', storedAccessToken)
      //console.log('authConfig.meEndpoint: ', authConfig.meEndpoint)
      console.log('storedAccessToken: ', storedAccessToken)
      console.log('authConfig.meEndpoint: ', authConfig.meEndpoint)

      if (storedAccessToken) { // la primera vez que se ejecute no entrará por aquí logicamente pues no hay token de acceso aún
        setLoading(true)
        try {
          //console.log("Entró por donde el token existe")
          console.log("Entró por donde el token existe")
          
          // auth/me -> se le envía el token de acceso y devuelve 200 si es válido o 401 si no lo es
          const response = await axiosInstance.get(authConfig.meEndpoint, {  // https://10.95.82.71:8085/auth/me + Authorization: Bearer token
@@ -68,12 +68,17 @@ const AuthProvider = ({ children }) => {
            }
          })
          
          console.log('Despues del get auth me')
          console.log('AuthContext response: ', response)
          setUser(getUserData())   // getUserData() -> devuelve el objeto JSON almacenado en la cookie USER_DATA_KEY
          setLoading(false)
        
        // SI EL TOKEN FALLA,
        } catch (error) { // EN CASO DE ERROR hace lo mismo pero con el token de refresco
          try {
            console.log('Entró por el catch de error')
            console.log('Redirigiendo al login...')
            router.push('/login')
            const response = await axiosInstance.post(authConfig.refreshEndpoint)
            setAccessToken(response.data.access_token)
            console.log('AuthContext access token: ', response.data.access_token)
@@ -113,12 +118,15 @@ const AuthProvider = ({ children }) => {
        }
      })

      console.log('LO PASA')
      console.log('LO PASA LA PETICION DE LOGIN')

      if (params.rememberMe) {
        console.log('Entro por el if de params.rememberMe')
        setAccessToken(response.data.access_token)
        console.log('AuthContext access token: ', response.data.access_token)
        const pruebatoken = getAccessToken()
        setRefreshToken(response.data.refresh_token)
        console.log
        setUserData({ username: params.username, role: 'admin' })
      }

Loading