Improve auth process 4
This commit is contained in:
@@ -119,6 +119,37 @@ fi
|
|||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
|
|
||||||
|
# ================================================================
|
||||||
|
# STEP 5: TENANT REGISTRATION (OPTIONAL)
|
||||||
|
# ================================================================
|
||||||
|
|
||||||
|
log_step "Step 5: Registering a bakery/tenant"
|
||||||
|
|
||||||
|
BAKERY_RESPONSE=$(curl -s -X POST "$API_BASE/api/v1/tenants/bakeries" \
|
||||||
|
-H "Authorization: Bearer $ACCESS_TOKEN" \
|
||||||
|
-H "Content-Type: application/json" \
|
||||||
|
-d "{
|
||||||
|
\"name\": \"Test Bakery $(date +%H%M)\",
|
||||||
|
\"business_type\": \"bakery\",
|
||||||
|
\"address\": \"Calle Test 123\",
|
||||||
|
\"city\": \"Madrid\",
|
||||||
|
\"postal_code\": \"28001\",
|
||||||
|
\"phone\": \"+34600123456\"
|
||||||
|
}")
|
||||||
|
|
||||||
|
echo "Bakery Registration Response:"
|
||||||
|
echo "$BAKERY_RESPONSE" | jq '.'
|
||||||
|
|
||||||
|
if echo "$BAKERY_RESPONSE" | jq -e '.id' > /dev/null; then
|
||||||
|
TENANT_ID=$(echo "$BAKERY_RESPONSE" | jq -r '.id')
|
||||||
|
log_success "Bakery registration successful! Tenant ID: $TENANT_ID"
|
||||||
|
else
|
||||||
|
log_warning "Bakery registration endpoint may not be fully implemented"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo ""
|
||||||
|
|
||||||
# ================================================================
|
# ================================================================
|
||||||
# STEP 2: USER LOGIN
|
# STEP 2: USER LOGIN
|
||||||
# ================================================================
|
# ================================================================
|
||||||
@@ -237,36 +268,6 @@ fi
|
|||||||
|
|
||||||
echo ""
|
echo ""
|
||||||
|
|
||||||
# ================================================================
|
|
||||||
# STEP 5: TENANT REGISTRATION (OPTIONAL)
|
|
||||||
# ================================================================
|
|
||||||
|
|
||||||
log_step "Step 5: Registering a bakery/tenant"
|
|
||||||
|
|
||||||
BAKERY_RESPONSE=$(curl -s -X POST "$API_BASE/api/v1/tenants/bakeries" \
|
|
||||||
-H "Authorization: Bearer $ACCESS_TOKEN" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d "{
|
|
||||||
\"name\": \"Test Bakery $(date +%H%M)\",
|
|
||||||
\"business_type\": \"bakery\",
|
|
||||||
\"address\": \"Calle Test 123\",
|
|
||||||
\"city\": \"Madrid\",
|
|
||||||
\"postal_code\": \"28001\",
|
|
||||||
\"phone\": \"+34600123456\"
|
|
||||||
}")
|
|
||||||
|
|
||||||
echo "Bakery Registration Response:"
|
|
||||||
echo "$BAKERY_RESPONSE" | jq '.'
|
|
||||||
|
|
||||||
if echo "$BAKERY_RESPONSE" | jq -e '.id' > /dev/null; then
|
|
||||||
TENANT_ID=$(echo "$BAKERY_RESPONSE" | jq -r '.id')
|
|
||||||
log_success "Bakery registration successful! Tenant ID: $TENANT_ID"
|
|
||||||
else
|
|
||||||
log_warning "Bakery registration endpoint may not be fully implemented"
|
|
||||||
fi
|
|
||||||
|
|
||||||
echo ""
|
|
||||||
|
|
||||||
# ================================================================
|
# ================================================================
|
||||||
# STEP 6: TOKEN REFRESH
|
# STEP 6: TOKEN REFRESH
|
||||||
# ================================================================
|
# ================================================================
|
||||||
|
|||||||
@@ -113,9 +113,16 @@ class AuthService:
|
|||||||
tenant_memberships = await AuthService._get_user_tenants(str(user.id))
|
tenant_memberships = await AuthService._get_user_tenants(str(user.id))
|
||||||
|
|
||||||
# Create tokens
|
# Create tokens
|
||||||
access_token = SecurityManager.create_access_token(user)
|
access_token = SecurityManager.create_access_token(
|
||||||
|
user_data={
|
||||||
|
"user_id": str(user.id),
|
||||||
|
"email": user.email,
|
||||||
|
"full_name": user.full_name,
|
||||||
|
"tenants": tenant_memberships # Include tenant info in token
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
refresh_token_value = SecurityManager.create_refresh_token(data={"user_id": str(user.id)})
|
refresh_token_value = SecurityManager.create_refresh_token(user_data={"user_id": str(user.id)})
|
||||||
|
|
||||||
# Store refresh token in database
|
# Store refresh token in database
|
||||||
refresh_token = RefreshToken(
|
refresh_token = RefreshToken(
|
||||||
@@ -198,7 +205,14 @@ class AuthService:
|
|||||||
tenant_memberships = await AuthService._get_user_tenants(str(user.id))
|
tenant_memberships = await AuthService._get_user_tenants(str(user.id))
|
||||||
|
|
||||||
# Create new access token
|
# Create new access token
|
||||||
access_token = SecurityManager.create_access_token(user)
|
access_token = SecurityManager.create_access_token(
|
||||||
|
user_data={
|
||||||
|
"user_id": str(user.id),
|
||||||
|
"email": user.email,
|
||||||
|
"full_name": user.full_name,
|
||||||
|
"tenants": tenant_memberships
|
||||||
|
}
|
||||||
|
)
|
||||||
|
|
||||||
return {
|
return {
|
||||||
"access_token": access_token,
|
"access_token": access_token,
|
||||||
|
|||||||
@@ -8,7 +8,7 @@ from fastapi import FastAPI
|
|||||||
from fastapi.middleware.cors import CORSMiddleware
|
from fastapi.middleware.cors import CORSMiddleware
|
||||||
|
|
||||||
from app.core.config import settings
|
from app.core.config import settings
|
||||||
from app.core.database import engine
|
from app.core.database import database_manager
|
||||||
from app.api import tenants
|
from app.api import tenants
|
||||||
from shared.monitoring.logging import setup_logging
|
from shared.monitoring.logging import setup_logging
|
||||||
from shared.monitoring.metrics import MetricsCollector
|
from shared.monitoring.metrics import MetricsCollector
|
||||||
@@ -51,7 +51,7 @@ async def startup_event():
|
|||||||
async def shutdown_event():
|
async def shutdown_event():
|
||||||
"""Cleanup on shutdown"""
|
"""Cleanup on shutdown"""
|
||||||
logger.info("Shutting down Tenant Service...")
|
logger.info("Shutting down Tenant Service...")
|
||||||
await engine.dispose()
|
await database_manager.engine.dispose()
|
||||||
|
|
||||||
@app.get("/health")
|
@app.get("/health")
|
||||||
async def health_check():
|
async def health_check():
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ Tenant models for bakery management - FIXED
|
|||||||
Removed cross-service User relationship to eliminate circular dependencies
|
Removed cross-service User relationship to eliminate circular dependencies
|
||||||
"""
|
"""
|
||||||
|
|
||||||
from sqlalchemy import Column, String, Boolean, DateTime, Float, ForeignKey, Text
|
from sqlalchemy import Column, String, Boolean, DateTime, Float, ForeignKey, Text, Integer
|
||||||
from sqlalchemy.dialects.postgresql import UUID
|
from sqlalchemy.dialects.postgresql import UUID
|
||||||
from sqlalchemy.orm import relationship
|
from sqlalchemy.orm import relationship
|
||||||
from datetime import datetime, timezone
|
from datetime import datetime, timezone
|
||||||
|
|||||||
@@ -2,17 +2,19 @@
|
|||||||
"""
|
"""
|
||||||
Tenant service messaging for event publishing
|
Tenant service messaging for event publishing
|
||||||
"""
|
"""
|
||||||
|
from shared.messaging.rabbitmq import RabbitMQClient
|
||||||
|
from app.core.config import settings
|
||||||
import structlog
|
import structlog
|
||||||
from shared.messaging.rabbitmq import RabbitMQPublisher
|
|
||||||
|
|
||||||
logger = structlog.get_logger()
|
logger = structlog.get_logger()
|
||||||
|
|
||||||
|
# Single global instance
|
||||||
|
data_publisher = RabbitMQClient(settings.RABBITMQ_URL, "data-service")
|
||||||
|
|
||||||
async def publish_tenant_created(tenant_id: str, owner_id: str, tenant_name: str):
|
async def publish_tenant_created(tenant_id: str, owner_id: str, tenant_name: str):
|
||||||
"""Publish tenant created event"""
|
"""Publish tenant created event"""
|
||||||
try:
|
try:
|
||||||
publisher = RabbitMQPublisher()
|
await data_publisher.publish_event(
|
||||||
await publisher.publish_event(
|
|
||||||
"tenant.created",
|
"tenant.created",
|
||||||
{
|
{
|
||||||
"tenant_id": tenant_id,
|
"tenant_id": tenant_id,
|
||||||
@@ -27,8 +29,7 @@ async def publish_tenant_created(tenant_id: str, owner_id: str, tenant_name: str
|
|||||||
async def publish_member_added(tenant_id: str, user_id: str, role: str):
|
async def publish_member_added(tenant_id: str, user_id: str, role: str):
|
||||||
"""Publish member added event"""
|
"""Publish member added event"""
|
||||||
try:
|
try:
|
||||||
publisher = RabbitMQPublisher()
|
await data_publisher.publish_event(
|
||||||
await publisher.publish_event(
|
|
||||||
"tenant.member.added",
|
"tenant.member.added",
|
||||||
{
|
{
|
||||||
"tenant_id": tenant_id,
|
"tenant_id": tenant_id,
|
||||||
|
|||||||
@@ -13,7 +13,7 @@ import uuid
|
|||||||
import json
|
import json
|
||||||
|
|
||||||
from app.models.tenants import Tenant, TenantMember
|
from app.models.tenants import Tenant, TenantMember
|
||||||
from app.schemas.tenants import BakeryRegistration, TenantResponse, TenantAccessResponse, TenantUpdate
|
from app.schemas.tenants import BakeryRegistration, TenantResponse, TenantAccessResponse, TenantUpdate, TenantMemberResponse
|
||||||
from app.services.messaging import publish_tenant_created, publish_member_added
|
from app.services.messaging import publish_tenant_created, publish_member_added
|
||||||
|
|
||||||
logger = structlog.get_logger()
|
logger = structlog.get_logger()
|
||||||
|
|||||||
Reference in New Issue
Block a user