Merge pull request 'Fix: Corregir inserción de tenant y relaciones en PostgreSQL usando formato -c en psql' (#17) from setup/init into development

Reviewed-on: ADUANASOFT/anexo76#17
This commit is contained in:
2025-11-14 03:18:46 +00:00
5 changed files with 40 additions and 47 deletions

View File

@@ -162,7 +162,7 @@ services:
- KEYCLOAK_REALM=${KEYCLOAK_REALM:-master} - KEYCLOAK_REALM=${KEYCLOAK_REALM:-master}
- KEYCLOAK_CLIENT_ID=${KEYCLOAK_CLIENT_ID:-anexo76-backend} - KEYCLOAK_CLIENT_ID=${KEYCLOAK_CLIENT_ID:-anexo76-backend}
- KEYCLOAK_CLIENT_SECRET=${KEYCLOAK_CLIENT_SECRET:-dev-secret} - KEYCLOAK_CLIENT_SECRET=${KEYCLOAK_CLIENT_SECRET:-dev-secret}
- CORS_ORIGINS=${CORS_ORIGINS:-http://localhost:5180,http://localhost:3000} - CORS_ORIGINS=${CORS_ORIGINS:-http://localhost:5173,http://localhost:3000}
ports: ports:
- "8000:8000" - "8000:8000"
depends_on: depends_on:
@@ -219,7 +219,7 @@ services:
- KEYCLOAK_CLIENT_ID=${KEYCLOAK_CLIENT_ID:-anexo76-backend} - KEYCLOAK_CLIENT_ID=${KEYCLOAK_CLIENT_ID:-anexo76-backend}
- KEYCLOAK_CLIENT_SECRET=${KEYCLOAK_CLIENT_SECRET:-zRU5NuvUFtBSOuh7Kdc372AItoWGLgz9} - KEYCLOAK_CLIENT_SECRET=${KEYCLOAK_CLIENT_SECRET:-zRU5NuvUFtBSOuh7Kdc372AItoWGLgz9}
ports: ports:
- "5180:5180" - "5173:5173"
depends_on: depends_on:
backend: backend:
condition: service_healthy condition: service_healthy
@@ -234,7 +234,7 @@ services:
restart: unless-stopped restart: unless-stopped
command: ["pnpm", "run", "dev", "--", "--host", "0.0.0.0"] command: ["pnpm", "run", "dev", "--", "--host", "0.0.0.0"]
healthcheck: healthcheck:
test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:5180/ || exit 1"] test: ["CMD-SHELL", "wget --no-verbose --tries=1 --spider http://localhost:5173/ || exit 1"]
interval: 15s interval: 15s
timeout: 5s timeout: 5s
retries: 5 retries: 5

View File

@@ -24,7 +24,7 @@ COPY . .
# RUN pnpm run build # RUN pnpm run build
# Exponer puerto # Exponer puerto
EXPOSE 5180 EXPOSE 5173
# Comando por defecto (desarrollo) # Comando por defecto (desarrollo)
CMD ["pnpm", "run", "dev", "--", "--host", "0.0.0.0"] CMD ["pnpm", "run", "dev", "--", "--host", "0.0.0.0"]

View File

@@ -5,7 +5,7 @@ import { sveltekit } from '@sveltejs/kit/vite';
export default defineConfig({ export default defineConfig({
server: { server: {
port: 5180, // fija el puerto port: 5173, // fija el puerto
host: true // escucha en 0.0.0.0 host: true // escucha en 0.0.0.0
}, },
plugins: [ plugins: [

View File

@@ -182,7 +182,7 @@ else
"baseUrl": "http://localhost:8000/api", "baseUrl": "http://localhost:8000/api",
"redirectUris": [ "redirectUris": [
"http://localhost:8000/*", "http://localhost:8000/*",
"http://localhost:5180/*" "http://localhost:5173/*"
], ],
"webOrigins": ["http://localhost:8000/api"], "webOrigins": ["http://localhost:8000/api"],
"attributes": { "attributes": {
@@ -273,18 +273,11 @@ else
"baseUrl": "http://localhost:5173", "baseUrl": "http://localhost:5173",
"redirectUris": [ "redirectUris": [
"http://localhost:5173/*", "http://localhost:5173/*",
"http://localhost:3000/*", "http://localhost:3000/*"
"http://localhost:5180/*"
],
"postLogoutRedirectUris": [
"http://localhost:5173/*",
"http://localhost:3000/*",
"http://localhost:5180/*"
], ],
"webOrigins": [ "webOrigins": [
"http://localhost:5173", "http://localhost:5173",
"http://localhost:3000", "http://localhost:3000"
"http://localhost:5180"
], ],
"attributes": { "attributes": {
"pkce.code.challenge.method": "S256" "pkce.code.challenge.method": "S256"
@@ -292,6 +285,8 @@ else
}') }')
HTTP_CODE=$(echo "$CREATE_FRONTEND" | tail -n1) HTTP_CODE=$(echo "$CREATE_FRONTEND" | tail -n1)
RESPONSE_BODY=$(echo "$CREATE_FRONTEND" | head -n -1)
if [ "$HTTP_CODE" = "201" ]; then if [ "$HTTP_CODE" = "201" ]; then
echo -e "${GREEN}✓ Cliente Frontend creado${NC}" echo -e "${GREEN}✓ Cliente Frontend creado${NC}"
# Obtener ID del cliente recién creado # Obtener ID del cliente recién creado
@@ -301,6 +296,7 @@ else
FRONTEND_CLIENT_ID=$(echo "$FRONTEND_CLIENT_EXISTS" | grep -o '"id":"[^"]*' | head -1 | sed 's/"id":"//') FRONTEND_CLIENT_ID=$(echo "$FRONTEND_CLIENT_EXISTS" | grep -o '"id":"[^"]*' | head -1 | sed 's/"id":"//')
else else
echo -e "${RED}✗ Error al crear cliente Frontend (HTTP ${HTTP_CODE})${NC}" echo -e "${RED}✗ Error al crear cliente Frontend (HTTP ${HTTP_CODE})${NC}"
echo "Respuesta del servidor: $RESPONSE_BODY"
fi fi
fi fi
@@ -488,62 +484,66 @@ echo -e "\n${YELLOW}[8/8] Creando tenant y company en PostgreSQL...${NC}"
# Esperar a que PostgreSQL esté listo # Esperar a que PostgreSQL esté listo
echo "Esperando a que PostgreSQL esté disponible..." echo "Esperando a que PostgreSQL esté disponible..."
MAX_PG_RETRIES=30 MAX_PG_RETRIES=60
PG_RETRY_COUNT=0 PG_RETRY_COUNT=0
while [ $PG_RETRY_COUNT -lt $MAX_PG_RETRIES ]; do while [ $PG_RETRY_COUNT -lt $MAX_PG_RETRIES ]; do
if PGPASSWORD="${POSTGRES_PASSWORD}" psql -h "${POSTGRES_HOST}" -p "${POSTGRES_PORT}" -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -c "SELECT 1;" > /dev/null 2>&1; then # Usar docker exec para verificar pg_isready directamente
if docker exec anexo76-postgres-a76 pg_isready -h localhost -U "${POSTGRES_USER}" > /dev/null 2>&1; then
echo -e "${GREEN}✓ PostgreSQL está listo${NC}" echo -e "${GREEN}✓ PostgreSQL está listo${NC}"
break break
fi fi
PG_RETRY_COUNT=$((PG_RETRY_COUNT + 1)) PG_RETRY_COUNT=$((PG_RETRY_COUNT + 1))
echo "Intento $PG_RETRY_COUNT/$MAX_PG_RETRIES..." echo "Intento $PG_RETRY_COUNT/$MAX_PG_RETRIES..."
sleep 2 sleep 1
done done
if [ $PG_RETRY_COUNT -eq $MAX_PG_RETRIES ]; then if [ $PG_RETRY_COUNT -eq $MAX_PG_RETRIES ]; then
echo -e "${RED}✗ Error: PostgreSQL no está disponible${NC}" echo -e "${RED}✗ Error: PostgreSQL no está disponible después de $MAX_PG_RETRIES intentos${NC}"
exit 1 exit 1
fi fi
# Insertar o actualizar tenant # Insertar o actualizar tenant
PGPASSWORD="${POSTGRES_PASSWORD}" psql -h "${POSTGRES_HOST}" -p "${POSTGRES_PORT}" -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" <<EOF echo "Insertando tenant en PostgreSQL..."
INSERT INTO a76.tenants (name, slug, type, keycloak_realm, contact_email, is_active, created_at, updated_at) docker exec -e PGPASSWORD="${POSTGRES_PASSWORD}" anexo76-postgres-a76 psql -h localhost -p 5432 -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -c "INSERT INTO a76.tenants (name, slug, type, keycloak_realm, contact_email, is_active, created_at, updated_at) VALUES ('${TENANT_NAME}', '${TENANT_SLUG}', 'SHARED'::tenanttype, '${KEYCLOAK_REALM}', '${DEMO_EMAIL}', true, now(), now()) ON CONFLICT (slug) DO UPDATE SET name = EXCLUDED.name, contact_email = EXCLUDED.contact_email, updated_at = CURRENT_TIMESTAMP;" 2>&1
VALUES ('${TENANT_NAME}', '${TENANT_SLUG}', 'SHARED', '${KEYCLOAK_REALM}', '${DEMO_EMAIL}', true, now(), now())
ON CONFLICT (slug)
DO UPDATE SET
name = EXCLUDED.name,
contact_email = EXCLUDED.contact_email,
updated_at = CURRENT_TIMESTAMP;
EOF
# Obtener el ID del tenant # Obtener el ID del tenant con mejor manejo de errores
TENANT_ID=$(PGPASSWORD="${POSTGRES_PASSWORD}" psql -h "${POSTGRES_HOST}" -p "${POSTGRES_PORT}" -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -t -c "SELECT id FROM a76.tenants WHERE slug = '${TENANT_SLUG}';") echo "Obteniendo ID del tenant..."
TENANT_ID=$(echo "$TENANT_ID" | xargs) # Trim whitespace TENANT_ID_RESULT=$(docker exec -e PGPASSWORD="${POSTGRES_PASSWORD}" anexo76-postgres-a76 psql -h localhost -p 5432 -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -t -c "SELECT id FROM a76.tenants WHERE slug = '${TENANT_SLUG}';" 2>&1)
if [ $? -ne 0 ]; then
echo -e "${RED}✗ Error al consultar el tenant:${NC}"
echo "$TENANT_ID_RESULT"
echo -e "${YELLOW}Verificando si la tabla existe...${NC}"
docker exec -e PGPASSWORD="${POSTGRES_PASSWORD}" anexo76-postgres-a76 psql -h localhost -p 5432 -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -c "\dt a76.tenants;"
exit 1
fi
TENANT_ID=$(echo "$TENANT_ID_RESULT" | xargs) # Trim whitespace
if [ -z "$TENANT_ID" ]; then if [ -z "$TENANT_ID" ]; then
echo -e "${RED}✗ Error: No se pudo obtener el ID del tenant${NC}" echo -e "${RED}✗ Error: No se pudo obtener el ID del tenant${NC}"
echo "Resultado de la consulta: '$TENANT_ID_RESULT'"
echo -e "${YELLOW}Intentando ver todos los tenants...${NC}"
docker exec -e PGPASSWORD="${POSTGRES_PASSWORD}" anexo76-postgres-a76 psql -h localhost -p 5432 -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -c "SELECT id, slug FROM a76.tenants LIMIT 10;"
exit 1 exit 1
fi fi
echo -e "${GREEN}✓ Tenant ID: ${TENANT_ID}${NC}" echo -e "${GREEN}✓ Tenant ID: ${TENANT_ID}${NC}"
# Insertar company si no existe # Insertar company si no existe
COMPANY_EXISTS=$(PGPASSWORD="${POSTGRES_PASSWORD}" psql -h "${POSTGRES_HOST}" -p "${POSTGRES_PORT}" -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -t -c "SELECT COUNT(*) FROM a76.company WHERE tenant_id = ${TENANT_ID};") COMPANY_EXISTS=$(docker exec -e PGPASSWORD="${POSTGRES_PASSWORD}" anexo76-postgres-a76 psql -h localhost -p 5432 -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -t -c "SELECT COUNT(*) FROM a76.company WHERE tenant_id = ${TENANT_ID};")
COMPANY_EXISTS=$(echo "$COMPANY_EXISTS" | xargs) COMPANY_EXISTS=$(echo "$COMPANY_EXISTS" | xargs)
if [ "$COMPANY_EXISTS" = "0" ]; then if [ "$COMPANY_EXISTS" = "0" ]; then
PGPASSWORD="${POSTGRES_PASSWORD}" psql -h "${POSTGRES_HOST}" -p "${POSTGRES_PORT}" -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" <<EOF docker exec -e PGPASSWORD="${POSTGRES_PASSWORD}" anexo76-postgres-a76 psql -h localhost -p 5432 -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -c "INSERT INTO a76.company (tenant_id, name, rfc, is_service_company, created_at, updated_at) VALUES (${TENANT_ID}, '${COMPANY_NAME}', '${COMPANY_RFC}', false, now(), now());" 2>&1
INSERT INTO a76.company (tenant_id, name, rfc, is_service_company, created_at, updated_at)
VALUES (${TENANT_ID}, '${COMPANY_NAME}', '${COMPANY_RFC}', false, now(), now());
EOF
echo -e "${GREEN}✓ Company creada${NC}" echo -e "${GREEN}✓ Company creada${NC}"
else else
echo -e "${YELLOW}⚠ Company ya existe para este tenant${NC}" echo -e "${YELLOW}⚠ Company ya existe para este tenant${NC}"
fi fi
# Obtener información de la company # Obtener información de la company
COMPANY_INFO=$(PGPASSWORD="${POSTGRES_PASSWORD}" psql -h "${POSTGRES_HOST}" -p "${POSTGRES_PORT}" -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -t -c "SELECT id, name FROM a76.company WHERE tenant_id = ${TENANT_ID} LIMIT 1;") COMPANY_INFO=$(docker exec -e PGPASSWORD="${POSTGRES_PASSWORD}" anexo76-postgres-a76 psql -h localhost -p 5432 -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -t -c "SELECT id, name FROM a76.company WHERE tenant_id = ${TENANT_ID} LIMIT 1;")
echo -e "${GREEN}✓ Company: ${COMPANY_INFO}${NC}" echo -e "${GREEN}✓ Company: ${COMPANY_INFO}${NC}"
@@ -564,14 +564,7 @@ echo -e "${GREEN}✓ Atributo tenant_id asignado al usuario${NC}"
# Agregar relación usuario-tenant en la base de datos # Agregar relación usuario-tenant en la base de datos
echo -e "\n${YELLOW}Creando relación usuario-tenant en la base de datos...${NC}" echo -e "\n${YELLOW}Creando relación usuario-tenant en la base de datos...${NC}"
PGPASSWORD="${POSTGRES_PASSWORD}" psql -h "${POSTGRES_HOST}" -p "${POSTGRES_PORT}" -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" <<EOF docker exec -e PGPASSWORD="${POSTGRES_PASSWORD}" anexo76-postgres-a76 psql -h localhost -p 5432 -U "${POSTGRES_USER}" -d "${POSTGRES_DB}" -c "INSERT INTO a76.user_tenants (keycloak_user_id, tenant_id, company_id, role, is_active, created_at, updated_at) VALUES ('${USER_ID}', ${TENANT_ID}, 1, 'admin', true, now(), now()) ON CONFLICT (keycloak_user_id, tenant_id, company_id) DO UPDATE SET is_active = true, updated_at = CURRENT_TIMESTAMP;" 2>&1
INSERT INTO a76.user_tenants (keycloak_user_id, tenant_id, company_id, role, is_active, created_at, updated_at)
VALUES ('${USER_ID}', ${TENANT_ID}, 1, 'admin', true, now(), now())
ON CONFLICT (keycloak_user_id, tenant_id, company_id)
DO UPDATE SET
is_active = true,
updated_at = CURRENT_TIMESTAMP;
EOF
echo -e "${GREEN}✓ Relación usuario-tenant creada en la base de datos${NC}" echo -e "${GREEN}✓ Relación usuario-tenant creada en la base de datos${NC}"
@@ -609,5 +602,5 @@ echo -e "\n${YELLOW}Configuración del usuario demo:${NC}"
echo -e " ${GREEN}${NC} tenant_id actualizado al ID real: ${TENANT_ID}" echo -e " ${GREEN}${NC} tenant_id actualizado al ID real: ${TENANT_ID}"
echo -e " ${GREEN}${NC} Relación usuario-tenant creada (rol: admin)" echo -e " ${GREEN}${NC} Relación usuario-tenant creada (rol: admin)"
echo -e "\n${YELLOW}Puedes acceder al sistema en:${NC}" echo -e "\n${YELLOW}Puedes acceder al sistema en:${NC}"
echo -e " ${GREEN}http://localhost:5180${NC}" echo -e " ${GREEN}http://localhost:5173${NC}"
echo -e "\n${GREEN}════════════════════════════════════════════════════════${NC}\n" echo -e "\n${GREEN}════════════════════════════════════════════════════════${NC}\n"

View File

@@ -155,7 +155,7 @@ echo -e "${GREEN} ✓ Instalación Completada${NC}"
echo "=========================================" echo "========================================="
echo "" echo ""
echo "Servicios disponibles:" echo "Servicios disponibles:"
echo -e " ${GREEN}${NC} Frontend: ${BLUE}http://localhost:5180${NC}" echo -e " ${GREEN}${NC} Frontend: ${BLUE}http://localhost:5173${NC}"
echo -e " ${GREEN}${NC} Backend: ${BLUE}http://localhost:8000/api${NC}" echo -e " ${GREEN}${NC} Backend: ${BLUE}http://localhost:8000/api${NC}"
echo -e " ${GREEN}${NC} API Docs: ${BLUE}http://localhost:8000/api/docs${NC}" echo -e " ${GREEN}${NC} API Docs: ${BLUE}http://localhost:8000/api/docs${NC}"
echo -e " ${GREEN}${NC} Keycloak: ${BLUE}http://localhost:8080${NC}" echo -e " ${GREEN}${NC} Keycloak: ${BLUE}http://localhost:8080${NC}"