Metadata-Version: 2.4
Name: user-service-byom
Version: 1.0.1
Summary: User Service for Distributed Issue Tracker - User profile, team, and preference management with role-based access control and event-driven architecture
Author-email: om kumar sahu <omkumarsahu747@gmail.com>
Maintainer-email: om kumar sahu <omkumarsahu747@gmail.com>
License-Expression: CC-BY-NC-4.0
Project-URL: Homepage, https://github.com/omkumar01/Distributed-Issue-Tracker-FastAPI-Microservices-
Project-URL: Repository, https://github.com/omkumar01/Distributed-Issue-Tracker-FastAPI-Microservices-
Project-URL: Documentation, https://github.com/omkumar01/Distributed-Issue-Tracker-FastAPI-Microservices-/tree/master/services/user-service
Project-URL: Bug Tracker, https://github.com/omkumar01/Distributed-Issue-Tracker-FastAPI-Microservices-/issues
Keywords: fastapi,user-management,teams,rbac,profiles,microservices,identity,permissions
Classifier: Development Status :: 4 - Beta
Classifier: Intended Audience :: Developers
Classifier: Operating System :: OS Independent
Classifier: Programming Language :: Python :: 3
Classifier: Programming Language :: Python :: 3.11
Classifier: Programming Language :: Python :: 3.12
Classifier: Topic :: Internet :: WWW/HTTP
Classifier: Topic :: Software Development :: Libraries :: Application Frameworks
Requires-Python: >=3.11
Description-Content-Type: text/markdown
Requires-Dist: fastapi==0.104.1
Requires-Dist: uvicorn[standard]==0.24.0
Requires-Dist: pydantic==2.5.0
Requires-Dist: pydantic-settings==2.1.0
Requires-Dist: pydantic[email]==2.5.0
Requires-Dist: sqlalchemy==2.0.23
Requires-Dist: psycopg2-binary==2.9.11
Requires-Dist: asyncpg==0.29.0
Requires-Dist: redis==5.0.1
Requires-Dist: httpx==0.25.2
Requires-Dist: python-jose[cryptography]==3.3.0
Requires-Dist: passlib[bcrypt]==1.7.4
Requires-Dist: python-multipart==0.0.6
Requires-Dist: celery==5.3.4
Requires-Dist: pika==1.3.2
Requires-Dist: elasticsearch==8.10.0
Requires-Dist: opentelemetry-api==1.21.0
Requires-Dist: opentelemetry-sdk==1.21.0
Requires-Dist: opentelemetry-exporter-jaeger==1.21.0
Requires-Dist: opentelemetry-instrumentation-fastapi==0.42b0
Requires-Dist: opentelemetry-instrumentation-sqlalchemy==0.42b0
Requires-Dist: opentelemetry-instrumentation-redis==0.42b0
Requires-Dist: alembic==1.13.1
Requires-Dist: python-dotenv==1.0.0

# User Service

User profile, team, and preference management service for the issue tracker platform.

## Service Structure

```
src/
├── api/
│   ├── users.py           # User endpoints
│   ├── teams.py           # Team endpoints
│   ├── roles.py           # Role endpoints
│   └── __init__.py        # Package exports
├── db/
│   ├── database.py        # Database connection
│   └── __init__.py        # Package exports
├── domain/
│   ├── user.py            # User domain model
│   ├── role.py            # Role domain model
│   └── __init__.py        # Package exports
├── events/
│   ├── consume.py         # Event consumers
│   ├── publish.py         # Event publishers
│   └── __init__.py        # Package exports
├── models/
│   ├── UserModel          # User database model
│   ├── TeamModel          # Team database model
│   ├── RoleModel          # Role database model
│   ├── MembershipModel    # Team membership model
│   └── __init__.py        # Package exports
├── repositories/
│   ├── UserRepository     # User CRUD operations
│   ├── TeamRepository     # Team CRUD operations
│   ├── RoleRepository     # Role CRUD operations
│   ├── MembershipRepository # Membership CRUD
│   └── __init__.py        # Package exports
├── routers/
│   ├── user_router.py     # User API routes
│   └── __init__.py        # Package exports
├── services/
│   ├── UserService        # User business logic
│   ├── TeamService        # Team business logic
│   ├── RoleService        # Role business logic
│   └── __init__.py        # Package exports
├── database.py            # Database utilities
├── main.py                # FastAPI application entrypoint
└── __init__.py            # Package exports
```

## Features

### User Management
- **User Profiles**: Create, read, update, delete user profiles
- **User Preferences**: Customizable user settings
- **Avatar Support**: Profile image management
- **Status Tracking**: Active/inactive user status

### Team Management
- **Team Creation**: Create and manage teams
- **Team Membership**: Add/remove members with roles
- **Team Hierarchy**: Nested team support
- **Team Settings**: Team-level configuration

### Role-Based Access Control
- **Role Definitions**: Define custom roles with permissions
- **Role Assignment**: Assign roles to users in teams
- **Permission Checking**: Verify user permissions
- **Default Roles**: Predefined roles (admin, member, viewer)

### Event Integration
- **User Events**: Publishes user.created, user.updated, user.deleted
- **Team Events**: Publishes team.created, team.updated, team.deleted
- **Membership Events**: Publishes membership changes
- **Consumes Events**: Listens for auth and project events

## API Endpoints

### Users

#### Create User
```
POST /api/v1/users
Content-Type: application/json

{
  "email": "user@example.com",
  "username": "john_doe",
  "first_name": "John",
  "last_name": "Doe",
  "preferences": {
    "theme": "dark",
    "notifications": true
  }
}
```

#### Get User
```
GET /api/v1/users/{user_id}

Response:
{
  "id": "uuid",
  "email": "user@example.com",
  "username": "john_doe",
  "first_name": "John",
  "last_name": "Doe",
  "is_active": true,
  "preferences": {...},
  "created_at": "2024-01-15T10:30:00Z",
  "updated_at": "2024-01-15T10:30:00Z"
}
```

#### Update User
```
PATCH /api/v1/users/{user_id}
Content-Type: application/json

{
  "first_name": "Jane",
  "preferences": {
    "theme": "light"
  }
}
```

#### Delete User
```
DELETE /api/v1/users/{user_id}
```

#### List Users
```
GET /api/v1/users?skip=0&limit=20&search=john

Query Parameters:
- skip: int (default: 0)
- limit: int (default: 20, max: 100)
- search: string (optional, searches email/username/name)
```

### Teams

#### Create Team
```
POST /api/v1/teams
Content-Type: application/json

{
  "name": "Engineering",
  "description": "Engineering team",
  "avatar_url": "https://..."
}
```

#### Get Team
```
GET /api/v1/teams/{team_id}
```

#### Update Team
```
PATCH /api/v1/teams/{team_id}
```

#### Delete Team
```
DELETE /api/v1/teams/{team_id}
```

#### List Teams
```
GET /api/v1/teams?skip=0&limit=20
```

### Team Membership

#### Add Member
```
POST /api/v1/teams/{team_id}/members
Content-Type: application/json

{
  "user_id": "uuid",
  "role_id": "uuid"
}
```

#### Update Member Role
```
PATCH /api/v1/teams/{team_id}/members/{user_id}
Content-Type: application/json

{
  "role_id": "uuid"
}
```

#### Remove Member
```
DELETE /api/v1/teams/{team_id}/members/{user_id}
```

#### List Members
```
GET /api/v1/teams/{team_id}/members
```

### Roles

#### Create Role
```
POST /api/v1/roles
Content-Type: application/json

{
  "name": "developer",
  "description": "Developer role",
  "permissions": ["issues.read", "issues.write", "comments.write"]
}
```

#### Get Role
```
GET /api/v1/roles/{role_id}
```

#### List Roles
```
GET /api/v1/roles
```

## Configuration

Environment variables (in `.env`):
```env
# Service
SERVICE_NAME=user-service
SERVICE_VERSION=1.0.0
ENVIRONMENT=development

# Database
DATABASE_URL=postgresql+asyncpg://postgres:postgres_password@postgres:5432/issue_tracker

# Redis
REDIS_URL=redis://redis:6379/0

# RabbitMQ
RABBITMQ_URL=amqp://guest:guest@rabbitmq:5672/

# Observability
JAEGER_ENABLED=false
JAEGER_HOST=jaeger
JAEGER_PORT=6831
```

## Health Check
```
GET /health

Response:
{
  "status": "healthy",
  "service": "user-service",
  "version": "1.0.0"
}
```

## Development

### Running the Service
```bash
# Install dependencies
pip install -r requirements.txt

# Run with uvicorn
uvicorn src.main:app --reload --host 0.0.0.0 --port 8000

# Or using Docker
docker build -f Dockerfile -t user-service .
docker run -p 8002:8000 --env-file .env user-service
```

### Testing
```bash
pytest tests/
pytest --cov=src tests/
```
