File size: 11,677 Bytes
6d12932
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
# πŸš€ Phase 2 Enhancement Roadmap

## Overview

Phase 2 transforms the Nursing Validator from a single-instance application into an **enterprise-grade, scalable platform** with four major feature sets:

1. **Phase 2.1: PostgreSQL Database Integration** βœ… (In Progress)
2. **Phase 2.2: Advanced Analytics Dashboard**
3. **Phase 2.3: EHR/FHIR Integration**
4. **Phase 2.4: Mobile App (React Native)**

---

## Phase 2.1: PostgreSQL Database Integration

### Objective
Replace JSON file-based storage with a robust PostgreSQL database for production scalability.

### Features Implemented

#### Database Schema
```sql

users              - User accounts, roles, permissions

sessions           - Active sessions, expiry, tracking

chat_history       - Persistent conversation storage

audit_logs         - Security and compliance logging

analytics_events   - User behavior and feature usage

schema_migrations  - Migration versioning

```

#### Connection Management
- **Connection Pooling**: SimpleConnectionPool (min: 2, max: 20 connections)
- **Context Managers**: Automatic connection handling and cleanup
- **Error Recovery**: Rollback on failures, detailed logging

#### Features

1. **Multi-User Chat History**
   - Per-user conversation persistence
   - Full-text search ready (Postgres native)
   - Export capabilities

2. **Audit Logging**
   - All user actions logged with timestamp and IP
   - Change tracking with JSONB storage
   - Compliance-ready (HIPAA, GDPR)

3. **Analytics Events**
   - Track feature usage
   - Understand user behavior
   - Generate compliance reports

4. **Automated Backups**
   - Daily backup automation (pg_dump)

   - Retention policies (keep 30 days)

   - One-click restore functionality



### Setup Instructions



#### 1. Prerequisites



```bash

# Install PostgreSQL (if not already installed)

# macOS

brew install postgresql



# Ubuntu/Debian

sudo apt-get install postgresql postgresql-contrib



# Windows (via WSL or native installer)

choco install postgresql

```



#### 2. Create Database



```bash

# Connect to PostgreSQL as admin

sudo -u postgres psql



# Create database and user

CREATE DATABASE nursing_validator;
CREATE USER nursing_admin WITH PASSWORD 'change_me_in_production';
ALTER ROLE nursing_admin SET client_encoding TO 'utf8';
ALTER ROLE nursing_admin SET default_transaction_isolation TO 'read committed';

ALTER ROLE nursing_admin SET default_transaction_deferrable TO ON;
ALTER ROLE nursing_admin SET timezone TO 'UTC';

GRANT ALL PRIVILEGES ON DATABASE nursing_validator TO nursing_admin;

\q

```



#### 3. Configure Environment



```bash

# Copy and update configuration

cp .env.production.example .env.production



# Edit .env.production with your database credentials

DB_HOST=localhost
DB_PORT=5432

DB_NAME=nursing_validator

DB_USER=nursing_admin

DB_PASSWORD=your_secure_password
DB_POOL_MIN=2
DB_POOL_MAX=20
BACKUP_DIR=/path/to/backups

USE_DATABASE=true
```



#### 4. Install Python Dependencies



```bash

pip install -r requirements.txt

# New packages added:

# - psycopg2-binary==2.9.9  (PostgreSQL adapter)

# - bcrypt==5.0.0           (Password hashing)

# - alembic==1.14.0         (Migration framework)

```

#### 5. Initialize Database

```bash

# Run migrations to create schema

python -c "from db_migrations import run_migrations; run_migrations()"



# Or in Python

from database import init_database

from db_migrations import run_migrations



init_database()

run_migrations()

```

#### 6. Run Application with Database

```bash

# Start with database backend

USE_DATABASE=true streamlit run app_phase2.py



# Or using the .env file

streamlit run app_phase2.py

```

### API Reference

#### Database Module (`database.py`)

```python

# Connection management

from database import init_connection_pool, get_connection



# Initialize once at startup

init_connection_pool()



# Use in context manager

with get_connection() as conn:

    cur = conn.cursor()

    cur.execute("SELECT * FROM users")

    results = cur.fetchall()

```

#### User Management

```python

from database import add_user, get_user, update_last_login



# Add new user

user_id = add_user(

    username="newuser",

    password_hash=hash_password("password"),

    role="nurse",

    email="nurse@hospital.com"

)



# Get user

user = get_user("username")



# Update last login

update_last_login(user_id)

```

#### Chat History

```python

from database import save_chat_message, get_chat_history, clear_chat_history



# Save message

message_id = save_chat_message(

    user_id=1,

    role="user",

    content="What is nursing care?",

    metadata={"source": "chat", "length": 25}

)



# Get history

history = get_chat_history(user_id=1, limit=100, offset=0)



# Clear history

deleted = clear_chat_history(user_id=1)

```

#### Audit Logging

```python

from database import log_audit_event, get_audit_logs



# Log event

event_id = log_audit_event(

    user_id=1,

    action="user_login",

    resource_type="user",

    resource_id="1",

    changes={"login_time": "2025-11-29T10:00:00"},

    ip_address="192.168.1.1"

)



# Get audit logs

logs = get_audit_logs(

    user_id=1,

    start_date="2025-11-01",

    end_date="2025-11-30",

    limit=100

)

```

#### Analytics

```python

from database import log_analytics_event, get_analytics_summary



# Log event

log_analytics_event(

    user_id=1,

    event_type="feature_usage",

    event_name="care_plan_view",

    data={"duration_seconds": 45}

)



# Get summary

summary = get_analytics_summary(

    start_date="2025-11-01",

    end_date="2025-11-30"

)

```

#### Backups

```python

from db_migrations import (

    create_backup,

    restore_backup,

    list_backups,

    cleanup_old_backups

)



# Create backup

backup_path = create_backup(backup_name="manual_backup.sql")



# List backups

backups = list_backups()



# Restore

restore_backup(backups[0])



# Clean up old ones (keep 10 most recent)

deleted = cleanup_old_backups(keep_count=10)

```

#### Migrations

```python

from db_migrations import run_migrations, rollback_migration



# Run all pending migrations

run_migrations()



# Rollback last 2 migrations

rollback_migration(steps=2)

```

### Database Architecture

```

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”

β”‚     Streamlit Application       β”‚

β”‚  (app_phase2.py)               β”‚

β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

               β”‚

               β–Ό

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”

β”‚   Database Module Layer         β”‚

β”‚  (database.py)                  β”‚

β”‚                                 β”‚

β”‚  - Connection pooling           β”‚

β”‚  - ORM-like functions           β”‚

β”‚  - Context managers             β”‚

β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

               β”‚

               β–Ό

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”

β”‚  Connection Pool                β”‚

β”‚  (psycopg2 SimpleConnectionPool)β”‚

β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

               β”‚

               β–Ό

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”

β”‚     PostgreSQL Database         β”‚

β”‚  - users                        β”‚

β”‚  - sessions                     β”‚

β”‚  - chat_history                 β”‚

β”‚  - audit_logs                   β”‚

β”‚  - analytics_events             β”‚

β”‚  - schema_migrations            β”‚

β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

```

### Performance Considerations

#### Connection Pooling
- **Min Pool Size**: 2 (for low-traffic)
- **Max Pool Size**: 20 (for high-traffic)
- **Timeout**: 5 seconds per connection request
- **Recycle**: Connections reset after queries

#### Indexes
Automatic indexes created on:
- `sessions.user_id`
- `chat_history.user_id`
- `chat_history.created_at` (for time-range queries)
- `audit_logs.user_id`
- `analytics_events.user_id`

#### Query Optimization
- Pagination built-in (limit/offset)
- Prepared statements (psycopg2 parameterization)
- JSONB for flexible metadata

### Security Features

#### Authentication
- Password hashing with SHA-256 (upgrade to bcrypt for Phase 2.2)
- Session tokens with expiry
- IP address logging
- Failed login tracking

#### Authorization
- Role-based access control (RBAC)
- Per-user data isolation
- Admin-only operations flagged

#### Audit Trail
- All user actions logged
- Change tracking with JSONB
- Compliance reporting ready

#### Data Protection
- Automatic backups
- Disaster recovery procedures
- GDPR-compliant data retention

### Troubleshooting

#### Connection Errors
```python

# If you get "could not connect to server"

# Check PostgreSQL is running:

sudo service postgresql status



# Start if needed:

sudo service postgresql start



# Verify credentials in .env.production

```

#### Permission Errors
```sql

-- Reset user permissions

GRANT ALL PRIVILEGES ON DATABASE nursing_validator TO nursing_admin;

GRANT ALL PRIVILEGES ON ALL TABLES IN SCHEMA public TO nursing_admin;

GRANT ALL PRIVILEGES ON ALL SEQUENCES IN SCHEMA public TO nursing_admin;

```

#### Backup Issues
```bash

# If pg_dump not found, install PostgreSQL client:

# macOS

brew install libpq



# Ubuntu

sudo apt-get install postgresql-client



# Add to PATH if needed

export PATH="/usr/lib/postgresql/XX/bin:$PATH"

```

### Migration Path from JSON

```python

# Script to migrate existing JSON chat history to PostgreSQL



import json

from database import add_user, save_chat_message, hash_password



# Load from JSON

with open('.chat_history.json', 'r') as f:

    json_data = json.load(f)



# Migrate each user's data

for username, messages in json_data.items():

    # Add user to database

    user_id = add_user(

        username=username,

        password_hash=hash_password("temp_password"),

        role="nurse"

    )

    

    # Migrate messages

    for msg in messages:

        save_chat_message(

            user_id=user_id,

            role=msg["role"],

            content=msg["content"]

        )



print(f"Migrated {len(json_data)} users to PostgreSQL")

```

### Next Steps

- Complete Phase 2.1 testing
- Deploy to staging with database
- Validate all migrations work
- Proceed to Phase 2.2: Analytics

### Files Added/Modified

**New Files:**
- `database.py` (365 lines) - Core database module
- `db_migrations.py` (250 lines) - Migration framework
- `app_phase2.py` (500 lines) - Updated app with DB support

**Modified Files:**
- `requirements.txt` - Added psycopg2-binary, bcrypt, alembic
- `.env.production.example` - Added database configuration

**Documentation:**
- `PHASE2_DATABASE.md` (this file)

---

## Next Phase: Phase 2.2 - Advanced Analytics Dashboard

After database integration is complete and tested, Phase 2.2 will add:
- Usage dashboards (who, what, when)
- Compliance reports
- Knowledge gap analysis
- Clinical outcome tracking

**Estimated Timeline:** 1-2 weeks

---

*Phase 2.1 Implementation - November 29, 2025*