major refactoring adding vendor and customer features
This commit is contained in:
214
app/services/team_service.py
Normal file
214
app/services/team_service.py
Normal file
@@ -0,0 +1,214 @@
|
||||
# app/services/team_service.py
|
||||
"""
|
||||
Team service for vendor team management.
|
||||
|
||||
This module provides:
|
||||
- Team member invitation
|
||||
- Role management
|
||||
- Team member CRUD operations
|
||||
"""
|
||||
|
||||
import logging
|
||||
from typing import List, Dict, Any
|
||||
from datetime import datetime, timezone
|
||||
|
||||
from sqlalchemy.orm import Session
|
||||
|
||||
from app.exceptions import (
|
||||
ValidationException,
|
||||
UnauthorizedVendorAccessException,
|
||||
)
|
||||
from models.database.vendor import VendorUser, Role
|
||||
from models.database.user import User
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
|
||||
class TeamService:
|
||||
"""Service for team management operations."""
|
||||
|
||||
def get_team_members(
|
||||
self, db: Session, vendor_id: int, current_user: User
|
||||
) -> List[Dict[str, Any]]:
|
||||
"""
|
||||
Get all team members for vendor.
|
||||
|
||||
Args:
|
||||
db: Database session
|
||||
vendor_id: Vendor ID
|
||||
current_user: Current user
|
||||
|
||||
Returns:
|
||||
List of team members
|
||||
"""
|
||||
try:
|
||||
vendor_users = db.query(VendorUser).filter(
|
||||
VendorUser.vendor_id == vendor_id,
|
||||
VendorUser.is_active == True
|
||||
).all()
|
||||
|
||||
members = []
|
||||
for vu in vendor_users:
|
||||
members.append({
|
||||
"id": vu.user_id,
|
||||
"email": vu.user.email,
|
||||
"first_name": vu.user.first_name,
|
||||
"last_name": vu.user.last_name,
|
||||
"role": vu.role.name,
|
||||
"role_id": vu.role_id,
|
||||
"is_active": vu.is_active,
|
||||
"joined_at": vu.created_at,
|
||||
})
|
||||
|
||||
return members
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting team members: {str(e)}")
|
||||
raise ValidationException("Failed to retrieve team members")
|
||||
|
||||
def invite_team_member(
|
||||
self, db: Session, vendor_id: int, invitation_data: dict, current_user: User
|
||||
) -> Dict[str, Any]:
|
||||
"""
|
||||
Invite a new team member.
|
||||
|
||||
Args:
|
||||
db: Database session
|
||||
vendor_id: Vendor ID
|
||||
invitation_data: Invitation details
|
||||
current_user: Current user
|
||||
|
||||
Returns:
|
||||
Invitation result
|
||||
"""
|
||||
try:
|
||||
# TODO: Implement full invitation flow with email
|
||||
# For now, return placeholder
|
||||
return {
|
||||
"message": "Team invitation feature coming soon",
|
||||
"email": invitation_data.get("email"),
|
||||
"role": invitation_data.get("role"),
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error inviting team member: {str(e)}")
|
||||
raise ValidationException("Failed to invite team member")
|
||||
|
||||
def update_team_member(
|
||||
self,
|
||||
db: Session,
|
||||
vendor_id: int,
|
||||
user_id: int,
|
||||
update_data: dict,
|
||||
current_user: User
|
||||
) -> Dict[str, Any]:
|
||||
"""
|
||||
Update team member role or status.
|
||||
|
||||
Args:
|
||||
db: Database session
|
||||
vendor_id: Vendor ID
|
||||
user_id: User ID to update
|
||||
update_data: Update data
|
||||
current_user: Current user
|
||||
|
||||
Returns:
|
||||
Updated member info
|
||||
"""
|
||||
try:
|
||||
vendor_user = db.query(VendorUser).filter(
|
||||
VendorUser.vendor_id == vendor_id,
|
||||
VendorUser.user_id == user_id
|
||||
).first()
|
||||
|
||||
if not vendor_user:
|
||||
raise ValidationException("Team member not found")
|
||||
|
||||
# Update fields
|
||||
if "role_id" in update_data:
|
||||
vendor_user.role_id = update_data["role_id"]
|
||||
|
||||
if "is_active" in update_data:
|
||||
vendor_user.is_active = update_data["is_active"]
|
||||
|
||||
vendor_user.updated_at = datetime.now(timezone.utc)
|
||||
db.commit()
|
||||
db.refresh(vendor_user)
|
||||
|
||||
return {
|
||||
"message": "Team member updated successfully",
|
||||
"user_id": user_id,
|
||||
}
|
||||
|
||||
except Exception as e:
|
||||
db.rollback()
|
||||
logger.error(f"Error updating team member: {str(e)}")
|
||||
raise ValidationException("Failed to update team member")
|
||||
|
||||
def remove_team_member(
|
||||
self, db: Session, vendor_id: int, user_id: int, current_user: User
|
||||
) -> bool:
|
||||
"""
|
||||
Remove team member from vendor.
|
||||
|
||||
Args:
|
||||
db: Database session
|
||||
vendor_id: Vendor ID
|
||||
user_id: User ID to remove
|
||||
current_user: Current user
|
||||
|
||||
Returns:
|
||||
True if removed
|
||||
"""
|
||||
try:
|
||||
vendor_user = db.query(VendorUser).filter(
|
||||
VendorUser.vendor_id == vendor_id,
|
||||
VendorUser.user_id == user_id
|
||||
).first()
|
||||
|
||||
if not vendor_user:
|
||||
raise ValidationException("Team member not found")
|
||||
|
||||
# Soft delete
|
||||
vendor_user.is_active = False
|
||||
vendor_user.updated_at = datetime.now(timezone.utc)
|
||||
db.commit()
|
||||
|
||||
logger.info(f"Removed user {user_id} from vendor {vendor_id}")
|
||||
return True
|
||||
|
||||
except Exception as e:
|
||||
db.rollback()
|
||||
logger.error(f"Error removing team member: {str(e)}")
|
||||
raise ValidationException("Failed to remove team member")
|
||||
|
||||
def get_vendor_roles(self, db: Session, vendor_id: int) -> List[Dict[str, Any]]:
|
||||
"""
|
||||
Get available roles for vendor.
|
||||
|
||||
Args:
|
||||
db: Database session
|
||||
vendor_id: Vendor ID
|
||||
|
||||
Returns:
|
||||
List of roles
|
||||
"""
|
||||
try:
|
||||
roles = db.query(Role).filter(Role.vendor_id == vendor_id).all()
|
||||
|
||||
return [
|
||||
{
|
||||
"id": role.id,
|
||||
"name": role.name,
|
||||
"permissions": role.permissions,
|
||||
}
|
||||
for role in roles
|
||||
]
|
||||
|
||||
except Exception as e:
|
||||
logger.error(f"Error getting vendor roles: {str(e)}")
|
||||
raise ValidationException("Failed to retrieve roles")
|
||||
|
||||
|
||||
# Create service instance
|
||||
team_service = TeamService()
|
||||
Reference in New Issue
Block a user