2025-11-20 13:28:35 -03:00
|
|
|
use crate::shared::state::AppState;
|
|
|
|
|
use axum::{
|
|
|
|
|
extract::{Query, State},
|
|
|
|
|
http::StatusCode,
|
|
|
|
|
response::{IntoResponse, Json},
|
|
|
|
|
};
|
2025-11-04 23:11:33 -03:00
|
|
|
use log::error;
|
2025-10-18 12:01:39 -03:00
|
|
|
use std::collections::HashMap;
|
2025-10-06 10:30:17 -03:00
|
|
|
use std::sync::Arc;
|
|
|
|
|
use uuid::Uuid;
|
2025-11-20 13:28:35 -03:00
|
|
|
|
2025-11-22 01:27:29 -03:00
|
|
|
pub mod facade;
|
`@media (prefers-color-scheme: dark)`
- ✅ Enhanced accessibility features (focus states, reduced motion)
- ✅ Added connection status component styles
- ✅ Improved responsive design
- ✅ Added utility classes for common patterns
- ✅ Added semantic HTML5 elements (`<header>`, `<main>`, `<nav>`)
- ✅ Comprehensive ARIA labels and roles for accessibility
- ✅ Keyboard navigation support (Alt+1-4 for sections, Esc for menus)
- ✅ Better event handling and state management
- ✅ Theme change subscriber with meta theme-color sync
- ✅ Online/offline connection monitoring
- ✅ Enhanced console logging with app info
- ✅ `THEMES.md` (400+ lines) - Complete theme system guide
- ✅ `README.md` (433+ lines) - Main application documentation
- ✅ `COMPONENTS.md` (773+ lines) - UI component library reference
- ✅ `QUICKSTART.md` (359+ lines) - Quick start guide for developers
- ✅ `REBUILD_NOTES.md` - This summary document
**Theme files define base colors:** ```css :root { --primary: 217 91%
60%; /* HSL: blue */ --background: 0 0% 100%; /* HSL: white */ } ```
**App.css bridges to working variables:** ```css :root { --accent-color:
hsl(var(--primary)); --primary-bg: hsl(var(--background));
--accent-light: hsla(var(--primary) / 0.1); } ```
**Components use working variables:** ```css .button { background:
var(--accent-color); color: hsl(var(--primary-foreground)); } ```
- ✅ Keyboard shortcuts (Alt+1-4, Esc)
- ✅ System dark mode detection
- ✅ Theme change event subscription
- ✅ Automatic document title updates
- ✅ Meta theme-color synchronization
- ✅ Enhanced console logging
- ✅ Better error handling
- ✅ Improved accessibility
- ✅ Theme switching via dropdown
- ✅ Theme persistence to localStorage
- ✅ Apps menu with section switching
- ✅ Dynamic section loading (Chat, Drive, Tasks, Mail)
- ✅ WebSocket chat functionality
- ✅ Alpine.js integration for other modules
- ✅ Responsive design
- ✅ Loading states
- [x] Theme switching works across all 19 themes
- [x] All sections load correctly
- [x] Keyboard shortcuts functional
- [x] Responsive on mobile/tablet/desktop
- [x] Accessibility features working
- [x] No console errors
- [x] Theme persistence works
- [x] Dark mode detection works
``` documentation/ ├── README.md # Main docs - start here ├──
QUICKSTART.md # 5-minute guide ├── THEMES.md # Theme system details ├──
COMPONENTS.md # UI component library └── REBUILD_NOTES.md # This summary
```
1. **HSL Bridge System**: Allows theme files to use shadcn-style HSL
variables while the app automatically derives working CSS properties
2. **No Breaking Changes**: All existing functionality preserved and
enhanced
3. **Developer-Friendly**: Comprehensive documentation for customization
4. **Accessibility First**: ARIA labels, keyboard navigation, focus
management
5. **Performance Optimized**: Instant theme switching, minimal reflows
- **Rebuild**: ✅ Complete
- **Testing**: ✅ Passed
- **Documentation**: ✅ Complete
- **Production Ready**: ✅ Yes
The rebuild successfully integrates the theme system throughout the UI
while maintaining all functionality and adding comprehensive
documentation for future development.
2025-11-21 09:28:02 -03:00
|
|
|
pub mod zitadel;
|
2025-11-22 01:27:29 -03:00
|
|
|
|
|
|
|
|
pub use facade::{
|
|
|
|
|
AuthFacade, AuthResult, CreateGroupRequest, CreateUserRequest, Group, Permission, Session,
|
|
|
|
|
SimpleAuthFacade, UpdateUserRequest, User, ZitadelAuthFacade,
|
|
|
|
|
};
|
`@media (prefers-color-scheme: dark)`
- ✅ Enhanced accessibility features (focus states, reduced motion)
- ✅ Added connection status component styles
- ✅ Improved responsive design
- ✅ Added utility classes for common patterns
- ✅ Added semantic HTML5 elements (`<header>`, `<main>`, `<nav>`)
- ✅ Comprehensive ARIA labels and roles for accessibility
- ✅ Keyboard navigation support (Alt+1-4 for sections, Esc for menus)
- ✅ Better event handling and state management
- ✅ Theme change subscriber with meta theme-color sync
- ✅ Online/offline connection monitoring
- ✅ Enhanced console logging with app info
- ✅ `THEMES.md` (400+ lines) - Complete theme system guide
- ✅ `README.md` (433+ lines) - Main application documentation
- ✅ `COMPONENTS.md` (773+ lines) - UI component library reference
- ✅ `QUICKSTART.md` (359+ lines) - Quick start guide for developers
- ✅ `REBUILD_NOTES.md` - This summary document
**Theme files define base colors:** ```css :root { --primary: 217 91%
60%; /* HSL: blue */ --background: 0 0% 100%; /* HSL: white */ } ```
**App.css bridges to working variables:** ```css :root { --accent-color:
hsl(var(--primary)); --primary-bg: hsl(var(--background));
--accent-light: hsla(var(--primary) / 0.1); } ```
**Components use working variables:** ```css .button { background:
var(--accent-color); color: hsl(var(--primary-foreground)); } ```
- ✅ Keyboard shortcuts (Alt+1-4, Esc)
- ✅ System dark mode detection
- ✅ Theme change event subscription
- ✅ Automatic document title updates
- ✅ Meta theme-color synchronization
- ✅ Enhanced console logging
- ✅ Better error handling
- ✅ Improved accessibility
- ✅ Theme switching via dropdown
- ✅ Theme persistence to localStorage
- ✅ Apps menu with section switching
- ✅ Dynamic section loading (Chat, Drive, Tasks, Mail)
- ✅ WebSocket chat functionality
- ✅ Alpine.js integration for other modules
- ✅ Responsive design
- ✅ Loading states
- [x] Theme switching works across all 19 themes
- [x] All sections load correctly
- [x] Keyboard shortcuts functional
- [x] Responsive on mobile/tablet/desktop
- [x] Accessibility features working
- [x] No console errors
- [x] Theme persistence works
- [x] Dark mode detection works
``` documentation/ ├── README.md # Main docs - start here ├──
QUICKSTART.md # 5-minute guide ├── THEMES.md # Theme system details ├──
COMPONENTS.md # UI component library └── REBUILD_NOTES.md # This summary
```
1. **HSL Bridge System**: Allows theme files to use shadcn-style HSL
variables while the app automatically derives working CSS properties
2. **No Breaking Changes**: All existing functionality preserved and
enhanced
3. **Developer-Friendly**: Comprehensive documentation for customization
4. **Accessibility First**: ARIA labels, keyboard navigation, focus
management
5. **Performance Optimized**: Instant theme switching, minimal reflows
- **Rebuild**: ✅ Complete
- **Testing**: ✅ Passed
- **Documentation**: ✅ Complete
- **Production Ready**: ✅ Yes
The rebuild successfully integrates the theme system throughout the UI
while maintaining all functionality and adding comprehensive
documentation for future development.
2025-11-21 09:28:02 -03:00
|
|
|
pub use zitadel::{UserWorkspace, ZitadelAuth, ZitadelConfig, ZitadelUser};
|
|
|
|
|
|
2025-11-04 23:11:33 -03:00
|
|
|
pub struct AuthService {}
|
2025-11-20 13:28:35 -03:00
|
|
|
|
2025-10-06 10:30:17 -03:00
|
|
|
impl AuthService {
|
2025-11-20 13:28:35 -03:00
|
|
|
pub fn new() -> Self {
|
|
|
|
|
Self {}
|
|
|
|
|
}
|
2025-10-06 10:30:17 -03:00
|
|
|
}
|
2025-11-20 13:28:35 -03:00
|
|
|
|
2025-11-17 10:00:12 -03:00
|
|
|
pub async fn auth_handler(
|
2025-11-20 13:28:35 -03:00
|
|
|
State(state): State<Arc<AppState>>,
|
|
|
|
|
Query(params): Query<HashMap<String, String>>,
|
|
|
|
|
) -> impl IntoResponse {
|
|
|
|
|
// Extract parameters
|
|
|
|
|
let bot_name = params.get("bot_name").cloned().unwrap_or_default();
|
|
|
|
|
let _token = params.get("token").cloned();
|
|
|
|
|
|
|
|
|
|
// Retrieve or create anonymous user
|
|
|
|
|
let user_id = {
|
|
|
|
|
let mut sm = state.session_manager.lock().await;
|
|
|
|
|
match sm.get_or_create_anonymous_user(None) {
|
|
|
|
|
Ok(id) => id,
|
|
|
|
|
Err(e) => {
|
|
|
|
|
error!("Failed to create anonymous user: {}", e);
|
|
|
|
|
return (
|
|
|
|
|
StatusCode::INTERNAL_SERVER_ERROR,
|
|
|
|
|
Json(serde_json::json!({ "error": "Failed to create user" })),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Resolve bot ID and name
|
|
|
|
|
let (bot_id, bot_name) = match tokio::task::spawn_blocking({
|
|
|
|
|
let bot_name = bot_name.clone();
|
|
|
|
|
let conn = state.conn.clone();
|
|
|
|
|
move || {
|
|
|
|
|
let mut db_conn = conn
|
|
|
|
|
.get()
|
|
|
|
|
.map_err(|e| format!("Failed to get database connection: {}", e))?;
|
|
|
|
|
use crate::shared::models::schema::bots::dsl::*;
|
|
|
|
|
use diesel::prelude::*;
|
|
|
|
|
match bots
|
|
|
|
|
.filter(name.eq(&bot_name))
|
|
|
|
|
.filter(is_active.eq(true))
|
|
|
|
|
.select((id, name))
|
|
|
|
|
.first::<(Uuid, String)>(&mut db_conn)
|
|
|
|
|
.optional()
|
|
|
|
|
{
|
|
|
|
|
Ok(Some((id_val, name_val))) => Ok((id_val, name_val)),
|
|
|
|
|
Ok(None) => match bots
|
|
|
|
|
.filter(is_active.eq(true))
|
|
|
|
|
.select((id, name))
|
|
|
|
|
.first::<(Uuid, String)>(&mut db_conn)
|
|
|
|
|
.optional()
|
|
|
|
|
{
|
|
|
|
|
Ok(Some((id_val, name_val))) => Ok((id_val, name_val)),
|
|
|
|
|
Ok(None) => Err("No active bots found".to_string()),
|
|
|
|
|
Err(e) => Err(format!("DB error: {}", e)),
|
|
|
|
|
},
|
|
|
|
|
Err(e) => Err(format!("DB error: {}", e)),
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
.await
|
|
|
|
|
{
|
|
|
|
|
Ok(Ok(res)) => res,
|
|
|
|
|
Ok(Err(e)) => {
|
|
|
|
|
error!("{}", e);
|
|
|
|
|
return (
|
|
|
|
|
StatusCode::INTERNAL_SERVER_ERROR,
|
|
|
|
|
Json(serde_json::json!({ "error": e })),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
Err(e) => {
|
|
|
|
|
error!("Spawn blocking failed: {}", e);
|
|
|
|
|
return (
|
|
|
|
|
StatusCode::INTERNAL_SERVER_ERROR,
|
|
|
|
|
Json(serde_json::json!({ "error": "DB thread error" })),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Create session
|
|
|
|
|
let session = {
|
|
|
|
|
let mut sm = state.session_manager.lock().await;
|
|
|
|
|
match sm.get_or_create_user_session(user_id, bot_id, "Auth Session") {
|
|
|
|
|
Ok(Some(sess)) => sess,
|
|
|
|
|
Ok(None) => {
|
|
|
|
|
error!("Failed to create session");
|
|
|
|
|
return (
|
|
|
|
|
StatusCode::INTERNAL_SERVER_ERROR,
|
|
|
|
|
Json(serde_json::json!({ "error": "Failed to create session" })),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
Err(e) => {
|
|
|
|
|
error!("Failed to create session: {}", e);
|
|
|
|
|
return (
|
|
|
|
|
StatusCode::INTERNAL_SERVER_ERROR,
|
|
|
|
|
Json(serde_json::json!({ "error": e.to_string() })),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Attempt to run auth script if present
|
|
|
|
|
let auth_script_path = format!("./work/{}.gbai/{}.gbdialog/auth.ast", bot_name, bot_name);
|
|
|
|
|
if tokio::fs::metadata(&auth_script_path).await.is_ok() {
|
|
|
|
|
let auth_script = match tokio::fs::read_to_string(&auth_script_path).await {
|
|
|
|
|
Ok(content) => content,
|
|
|
|
|
Err(e) => {
|
|
|
|
|
error!("Failed to read auth script: {}", e);
|
|
|
|
|
return (
|
|
|
|
|
StatusCode::OK,
|
|
|
|
|
Json(serde_json::json!({
|
|
|
|
|
"user_id": session.user_id,
|
|
|
|
|
"session_id": session.id,
|
|
|
|
|
"status": "authenticated"
|
|
|
|
|
})),
|
|
|
|
|
);
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
// Run script in blocking context since Rhai is not Send
|
|
|
|
|
let state_clone = Arc::clone(&state);
|
|
|
|
|
let session_clone = session.clone();
|
|
|
|
|
match tokio::task::spawn_blocking(move || {
|
|
|
|
|
let script_service = crate::basic::ScriptService::new(state_clone, session_clone);
|
|
|
|
|
match script_service.compile(&auth_script) {
|
|
|
|
|
Ok(ast) => match script_service.run(&ast) {
|
|
|
|
|
Ok(_) => Ok(()),
|
|
|
|
|
Err(e) => Err(format!("Script execution error: {}", e)),
|
|
|
|
|
},
|
|
|
|
|
Err(e) => Err(format!("Script compilation error: {}", e)),
|
|
|
|
|
}
|
|
|
|
|
})
|
|
|
|
|
.await
|
|
|
|
|
{
|
|
|
|
|
Ok(Ok(())) => {}
|
|
|
|
|
Ok(Err(e)) => {
|
|
|
|
|
error!("Auth script error: {}", e);
|
|
|
|
|
}
|
|
|
|
|
Err(e) => {
|
|
|
|
|
error!("Auth script task error: {}", e);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Return successful authentication response
|
|
|
|
|
(
|
|
|
|
|
StatusCode::OK,
|
|
|
|
|
Json(serde_json::json!({
|
|
|
|
|
"user_id": session.user_id,
|
|
|
|
|
"session_id": session.id,
|
|
|
|
|
"status": "authenticated"
|
|
|
|
|
})),
|
|
|
|
|
)
|
2025-10-18 12:01:39 -03:00
|
|
|
}
|
2025-11-20 13:28:35 -03:00
|
|
|
|
2025-11-05 08:06:18 -03:00
|
|
|
#[cfg(test)]
|
|
|
|
|
pub mod auth_test;
|