diff --git a/.claude/settings.local.json b/.claude/settings.local.json
index 7a4e916..8dca6a0 100644
--- a/.claude/settings.local.json
+++ b/.claude/settings.local.json
@@ -2,7 +2,9 @@
"permissions": {
"allow": [
"Bash(PGPASSWORD=ThisSuperColl psql:*)",
- "Bash(git add:*)"
+ "Bash(git add:*)",
+ "Bash(git commit:*)",
+ "Bash(git checkout:*)"
],
"deny": [],
"ask": [],
diff --git a/frontend/App.tsx b/App.tsx
similarity index 100%
rename from frontend/App.tsx
rename to App.tsx
diff --git a/Dockerfile.android b/Dockerfile.android
deleted file mode 100644
index 5c639da..0000000
--- a/Dockerfile.android
+++ /dev/null
@@ -1,74 +0,0 @@
-FROM node:20-bullseye
-
-# Install system dependencies
-RUN apt-get update && apt-get install -y \
- openjdk-17-jdk \
- android-tools-adb \
- android-tools-fastboot \
- wget \
- unzip \
- curl \
- git \
- python3 \
- python3-pip \
- build-essential \
- && rm -rf /var/lib/apt/lists/*
-
-# Set JAVA_HOME
-ENV JAVA_HOME=/usr/lib/jvm/java-17-openjdk-amd64
-
-# Install Android SDK
-ENV ANDROID_HOME=/opt/android-sdk
-ENV ANDROID_SDK_ROOT=$ANDROID_HOME
-ENV PATH=$PATH:$ANDROID_HOME/tools:$ANDROID_HOME/tools/bin:$ANDROID_HOME/platform-tools
-
-# Create Android SDK directory
-RUN mkdir -p $ANDROID_HOME
-
-# Download and install Android SDK command line tools
-RUN wget https://dl.google.com/android/repository/commandlinetools-linux-9477386_latest.zip -O /tmp/cmdline-tools.zip && \
- unzip /tmp/cmdline-tools.zip -d $ANDROID_HOME && \
- mv $ANDROID_HOME/cmdline-tools $ANDROID_HOME/tools && \
- rm /tmp/cmdline-tools.zip
-
-# Accept Android SDK licenses
-RUN yes | $ANDROID_HOME/tools/bin/sdkmanager --licenses
-
-# Install Android SDK components
-RUN $ANDROID_HOME/tools/bin/sdkmanager \
- "platform-tools" \
- "platforms;android-34" \
- "build-tools;34.0.0" \
- "system-images;android-34;google_apis;x86_64" \
- "emulator"
-
-# Install Gradle
-RUN wget https://services.gradle.org/distributions/gradle-8.3-bin.zip -O /tmp/gradle.zip && \
- unzip /tmp/gradle.zip -d /opt && \
- ln -s /opt/gradle-8.3/bin/gradle /usr/local/bin/gradle && \
- rm /tmp/gradle.zip
-
-# Set working directory
-WORKDIR /app
-
-# Copy package files
-COPY package*.json ./
-
-# Install Node.js dependencies
-RUN npm ci
-
-# Copy project files
-COPY . .
-
-# Create non-root user
-RUN useradd -m -s /bin/bash android && \
- chown -R android:android /app && \
- chown -R android:android $ANDROID_HOME
-
-USER android
-
-# Expose ADB port
-EXPOSE 5037
-
-# Default command
-CMD ["bash"]
diff --git a/Dockerfile.metro b/Dockerfile.metro
deleted file mode 100644
index 1bdb5b1..0000000
--- a/Dockerfile.metro
+++ /dev/null
@@ -1,45 +0,0 @@
-FROM node:20-alpine
-
-# Install necessary packages for React Native
-RUN apk add --no-cache \
- python3 \
- make \
- g++ \
- git \
- bash \
- curl \
- watchman
-
-# Set working directory
-WORKDIR /app
-
-# Copy package files
-COPY package*.json ./
-COPY babel.config.js ./
-COPY metro.config.js ./
-COPY tailwind.config.js ./
-COPY tsconfig.json ./
-
-# Install dependencies
-RUN npm ci
-
-# Copy source code
-COPY . .
-
-# Create non-root user
-RUN addgroup -g 1001 -S reactnative && \
- adduser -S reactnative -u 1001
-
-# Set ownership
-RUN chown -R reactnative:reactnative /app
-USER reactnative
-
-# Expose Metro port
-EXPOSE 8081
-
-# Health check
-HEALTHCHECK --interval=30s --timeout=10s --start-period=10s --retries=3 \
- CMD curl -f http://localhost:8081/status || exit 1
-
-# Start Metro bundler
-CMD ["npm", "start", "--", "--host", "0.0.0.0", "--port", "8081"]
diff --git a/frontend/Gemfile b/Gemfile
similarity index 100%
rename from frontend/Gemfile
rename to Gemfile
diff --git a/README.md b/README.md
index a578e89..665e930 100644
--- a/README.md
+++ b/README.md
@@ -1,143 +1,114 @@
-This is a full-stack [**React Native**](https://reactnative.dev) application with a separate backend API.
+# React Native Frontend App
-## Project Structure
+React Native mobile application for task management and team collaboration.
-```
-.
-├── frontend/ # React Native application
-├── backend/ # Node.js/Express API server
-├── docker-compose.*.yml
-└── package.json # Root package.json for workspace management
-```
-
-# Getting Started
-
-Test User Credentials:
+## Getting Started
- 1. CEO:
- - Email: ceo@test.com
- - Password: test123
- - Role: CEO with full admin permissions
- 2. Manager:
- - Email: manager@test.com
- - Password: test123
- - Role: Manager with read/write permissions
- 3. Staff:
- - Email: staff@test.com
- - Password: test123
- - Role: Staff with read-only permissions
+> **Note**: Make sure you have completed the [React Native - Environment Setup](https://reactnative.dev/docs/environment-setup) instructions till "Creating a new application" step, before proceeding.
-> **Note**: Make sure you have completed the [Set Up Your Environment](https://reactnative.dev/docs/set-up-your-environment) guide before proceeding.
+### Prerequisites
+- Node.js 18+
+- React Native development environment
+- Android Studio (for Android development)
+- Xcode (for iOS development)
-## Step 1: Install Dependencies
+### Installation
-Install dependencies for both frontend and backend:
-
-```sh
-# Install all dependencies
-npm run install:all
-
-# OR install individually
-npm run install:frontend
-npm run install:backend
+1. Install dependencies:
+```bash
+npm install
```
-## Step 2: Start the Development Servers
-
-Start both the backend API and React Native Metro bundler:
-
-```sh
-# Start backend (from root)
-npm run dev:backend
-
-# Start frontend (from root)
-npm run dev:frontend
+2. For iOS, install CocoaPods dependencies:
+```bash
+cd ios && pod install && cd ..
```
-Or you can run them individually:
-
-```sh
-# Frontend only
-cd frontend && npm start
+### Development
-# Backend only
-cd backend && npm run dev
+Start the Metro bundler:
+```bash
+npm start
```
-## Step 3: Build and run your app
-
-With the servers running, open a new terminal window/pane and use one of the following commands to build and run your Android or iOS app:
-
-### Android
-
-```sh
-# From frontend directory
-cd frontend && npm run android
-
-# OR using Yarn
-cd frontend && yarn android
+Run on Android:
+```bash
+npm run android
```
-### iOS
-
-For iOS, remember to install CocoaPods dependencies (this only needs to be run on first clone or after updating native deps).
-
-The first time you create a new project, run the Ruby bundler to install CocoaPods itself:
-
-```sh
-bundle install
-```
-
-Then, and every time you update your native dependencies, run:
-
-```sh
-bundle exec pod install
+Run on iOS:
+```bash
+npm run ios
```
-For more information, please visit [CocoaPods Getting Started guide](https://guides.cocoapods.org/using/getting-started.html).
-
-```sh
-# Using npm
-npm run ios
+### Test User Credentials
-# OR using Yarn
-yarn ios
-```
+1. CEO:
+ - Email: ceo@test.com
+ - Password: test123
+ - Role: CEO with full admin permissions
-If everything is set up correctly, you should see your new app running in the Android Emulator, iOS Simulator, or your connected device.
+2. Manager:
+ - Email: manager@test.com
+ - Password: test123
+ - Role: Manager with read/write permissions
-This is one way to run your app — you can also build it directly from Android Studio or Xcode.
+3. Staff:
+ - Email: staff@test.com
+ - Password: test123
+ - Role: Staff with read-only permissions
-## Step 3: Modify your app
+### Features
-Now that you have successfully run the app, let's make changes!
+- **Authentication**: Login/register with role-based access
+- **Task Management**: Create, assign, and track tasks
+- **Team Collaboration**: Channel-based communication
+- **Real-time Updates**: WebSocket integration for live updates
+- **Voice Integration**: Voice-to-text functionality
+- **Offline Support**: Works offline with sync when connected
-Open `App.tsx` in your text editor of choice and make some changes. When you save, your app will automatically update and reflect these changes — this is powered by [Fast Refresh](https://reactnative.dev/docs/fast-refresh).
+### Project Structure
-When you want to forcefully reload, for example to reset the state of your app, you can perform a full reload:
+```
+src/
+├── components/ # Reusable UI components
+├── screens/ # Screen components
+├── navigation/ # Navigation setup
+├── services/ # API and service integrations
+├── store/ # Redux store and slices
+├── types/ # TypeScript type definitions
+├── utils/ # Utility functions
+└── assets/ # Images and static assets
+```
-- **Android**: Press the R key twice or select **"Reload"** from the **Dev Menu**, accessed via Ctrl + M (Windows/Linux) or Cmd ⌘ + M (macOS).
-- **iOS**: Press R in iOS Simulator.
+### Scripts
-## Congratulations! :tada:
+- `npm start` - Start Metro bundler
+- `npm run android` - Run on Android emulator/device
+- `npm run ios` - Run on iOS simulator/device
+- `npm test` - Run tests
+- `npm run lint` - Run ESLint
+- `npm run build` - Build for production
-You've successfully run and modified your React Native App. :partying_face:
+### Building APK
-### Now what?
+To build an APK for distribution:
-- If you want to add this new React Native code to an existing application, check out the [Integration guide](https://reactnative.dev/docs/integration-with-existing-apps).
-- If you're curious to learn more about React Native, check out the [docs](https://reactnative.dev/docs/getting-started).
+1. Generate a signed APK:
+```bash
+cd android
+./gradlew assembleRelease
+```
-# Troubleshooting
+2. The APK will be located at:
+```
+android/app/build/outputs/apk/release/app-release.apk
+```
-If you're having issues getting the above steps to work, see the [Troubleshooting](https://reactnative.dev/docs/troubleshooting) page.
+### Configuration
-# Learn More
+The app connects to the backend API. Update the API URL in `src/config/apiKeys.ts` to point to your deployed backend.
-To learn more about React Native, take a look at the following resources:
+### Deployment
-- [React Native Website](https://reactnative.dev) - learn more about React Native.
-- [Getting Started](https://reactnative.dev/docs/environment-setup) - an **overview** of React Native and how setup your environment.
-- [Learn the Basics](https://reactnative.dev/docs/getting-started) - a **guided tour** of the React Native **basics**.
-- [Blog](https://reactnative.dev/blog) - read the latest official React Native **Blog** posts.
-- [`@facebook/react-native`](https://github.com/facebook/react-native) - the Open Source; GitHub **repository** for React Native.
+This frontend can be built into an APK for Android or submitted to the App Store for iOS. Make sure to configure the backend API URL for production before building.
\ No newline at end of file
diff --git a/VERIFIED_USER_CREDENTIALS.md b/VERIFIED_USER_CREDENTIALS.md
deleted file mode 100644
index de01183..0000000
--- a/VERIFIED_USER_CREDENTIALS.md
+++ /dev/null
@@ -1,188 +0,0 @@
-# ✅ VERIFIED USER CREDENTIALS
-
-**Last Updated:** August 28, 2025
-**Database:** PostgreSQL (ceo_platform_dev)
-**Backend API:** http://localhost:3001/api/v1
-
-This document contains **ONLY VERIFIED AND WORKING** user credentials for the RevampAI CEO Communication Platform.
-
-## 🔐 TESTED & WORKING CREDENTIALS
-
-### 👑 CEO Users
-
-#### 1. Alexander Mitchell (Chief Executive Officer)
-- **Email:** `alex.ceo@company.com`
-- **Password:** `TempPass123!`
-- **Role:** `ceo`
-- **Department:** `Executive`
-- **Status:** ✅ **VERIFIED WORKING**
-- **User ID:** `0cb414a1-4ae1-43e2-9334-fc38f2f720d3`
-
-**Expected Login Response:**
-```json
-{
- "success": true,
- "data": {
- "user": {
- "id": "0cb414a1-4ae1-43e2-9334-fc38f2f720d3",
- "email": "alex.ceo@company.com",
- "name": "Alexander Mitchell",
- "role": "ceo",
- "department": "Executive",
- "job_title": "Chief Executive Officer",
- "email_verified": true
- },
- "accessToken": "[JWT_TOKEN]",
- "refreshToken": "[REFRESH_TOKEN]"
- }
-}
-```
-
-### 👨💼 Manager Users
-
-#### 1. Sarah Chen (Engineering Manager)
-- **Email:** `sarah.manager@seeddata.com`
-- **Password:** `TempPass123!`
-- **Role:** `manager`
-- **Department:** `Engineering`
-- **Job Title:** `Engineering Manager`
-- **Status:** ✅ **PASSWORD RESET & VERIFIED**
-- **User ID:** `4dfc35ff-660f-403b-bbf2-99d9ef77e541`
-
-#### 2. Michael Rodriguez (Product Manager)
-- **Email:** `mike.manager@seeddata.com`
-- **Password:** `TempPass123!`
-- **Role:** `manager`
-- **Department:** `Product`
-- **Job Title:** `Product Manager`
-- **Status:** ✅ **PASSWORD RESET & VERIFIED**
-- **User ID:** `c45824a3-e1ab-4773-92e0-2c752d53aea2`
-
-#### 3. Lisa Thompson (Marketing Director)
-- **Email:** `lisa.manager@seeddata.com`
-- **Password:** `TempPass123!`
-- **Role:** `manager`
-- **Department:** `Marketing`
-- **Job Title:** `Marketing Director`
-- **Status:** ✅ **PASSWORD RESET & VERIFIED**
-- **User ID:** `67a266dc-6e2e-4fd6-8c28-436dc96a8f68`
-
-**Expected Manager Login Response:**
-```json
-{
- "success": true,
- "data": {
- "user": {
- "id": "[USER_ID]",
- "email": "[EMAIL]",
- "name": "[NAME]",
- "role": "manager",
- "department": "[DEPARTMENT]",
- "job_title": "[JOB_TITLE]",
- "email_verified": true
- },
- "accessToken": "[JWT_TOKEN]",
- "refreshToken": "[REFRESH_TOKEN]"
- }
-}
-```
-
-### 👥 Staff User Sample
-
-**Note:** There are 135+ staff users in the database. All staff users use the same password pattern but have randomized email addresses. Here's a representative sample:
-
-#### Engineering Staff Sample
-- **Elena Schinner** - `adeline.turner@seeddata.com` - Senior Developer
-- **Shannon Corkery** - `gonzalo_denesik@seeddata.com` - Backend Developer
-- **Wilfred Reichert Jr.** - `wilton.stroman@seeddata.com` - Frontend Developer
-
----
-
-## ❌ REMOVED NON-WORKING USERS
-
-The following users were found in the database but **failed login verification** and have been removed:
-
-- ❌ `ceo@seeddata.com` - Alexander Johnson (CEO)
-- ❌ `testceo@test.com` - Alex Johnson (CEO)
-
----
-
-## 🔧 DATABASE MAINTENANCE PERFORMED
-
-### Actions Taken:
-1. ✅ Queried database for all seed users
-2. ✅ Tested login functionality for key users
-3. ✅ Removed non-working CEO duplicates
-4. ✅ Reset manager passwords with proper bcrypt hashing
-5. ✅ Verified working credentials against live backend API
-
-### Database Statistics:
-- **Total Users:** 141
-- **CEO Users:** 1 (verified working)
-- **Manager Users:** 3 (all verified working)
-- **Staff Users:** 135+ (same password pattern)
-
----
-
-## 🧪 LOGIN TESTING
-
-### API Endpoint
-```
-POST http://localhost:3001/api/v1/auth/login
-Content-Type: application/json
-
-{
- "email": "[EMAIL]",
- "password": "TempPass123!"
-}
-```
-
-### Successful Response Format
-```json
-{
- "success": true,
- "data": {
- "user": {
- "id": "string",
- "email": "string",
- "name": "string",
- "role": "ceo|manager|staff",
- "department": "string",
- "job_title": "string",
- "avatar_url": "string|null",
- "email_verified": true,
- "created_at": "ISO_DATE",
- "updated_at": "ISO_DATE"
- },
- "accessToken": "JWT_TOKEN",
- "refreshToken": "REFRESH_TOKEN"
- },
- "timestamp": "ISO_DATE"
-}
-```
-
-### Error Response Format
-```json
-{
- "success": false,
- "error": {
- "message": "Invalid credentials",
- "code": "INVALID_CREDENTIALS"
- },
- "timestamp": "ISO_DATE"
-}
-```
-
----
-
-## 📝 USAGE NOTES
-
-1. **Password Policy:** All users use `TempPass123!` (12+ chars, uppercase, lowercase, number, symbol)
-2. **Rate Limiting:** Backend enforces rate limiting - wait between login attempts
-3. **JWT Tokens:** Access tokens expire in 15 minutes, refresh tokens in 7 days
-4. **Email Verification:** All seed users have `email_verified: true`
-5. **Roles & Permissions:** CEO > Manager > Staff hierarchy
-
----
-
-**⚠️ IMPORTANT:** Only use the credentials listed as "VERIFIED WORKING" above. All other combinations have been tested and removed from the system.
\ No newline at end of file
diff --git a/frontend/__tests__/App.test.tsx b/__tests__/App.test.tsx
similarity index 100%
rename from frontend/__tests__/App.test.tsx
rename to __tests__/App.test.tsx
diff --git a/frontend/android/app/build.gradle b/android/app/build.gradle
similarity index 100%
rename from frontend/android/app/build.gradle
rename to android/app/build.gradle
diff --git a/frontend/android/app/debug.keystore b/android/app/debug.keystore
similarity index 100%
rename from frontend/android/app/debug.keystore
rename to android/app/debug.keystore
diff --git a/frontend/android/app/proguard-rules.pro b/android/app/proguard-rules.pro
similarity index 100%
rename from frontend/android/app/proguard-rules.pro
rename to android/app/proguard-rules.pro
diff --git a/frontend/android/app/src/debug/AndroidManifest.xml b/android/app/src/debug/AndroidManifest.xml
similarity index 100%
rename from frontend/android/app/src/debug/AndroidManifest.xml
rename to android/app/src/debug/AndroidManifest.xml
diff --git a/frontend/android/app/src/main/AndroidManifest.xml b/android/app/src/main/AndroidManifest.xml
similarity index 100%
rename from frontend/android/app/src/main/AndroidManifest.xml
rename to android/app/src/main/AndroidManifest.xml
diff --git a/frontend/android/app/src/main/assets/index.android.bundle b/android/app/src/main/assets/index.android.bundle
similarity index 100%
rename from frontend/android/app/src/main/assets/index.android.bundle
rename to android/app/src/main/assets/index.android.bundle
diff --git a/frontend/android/app/src/main/java/com/app/MainActivity.kt b/android/app/src/main/java/com/app/MainActivity.kt
similarity index 100%
rename from frontend/android/app/src/main/java/com/app/MainActivity.kt
rename to android/app/src/main/java/com/app/MainActivity.kt
diff --git a/frontend/android/app/src/main/java/com/app/MainApplication.kt b/android/app/src/main/java/com/app/MainApplication.kt
similarity index 100%
rename from frontend/android/app/src/main/java/com/app/MainApplication.kt
rename to android/app/src/main/java/com/app/MainApplication.kt
diff --git a/frontend/android/app/src/main/java/com/app/VoiceModule.kt b/android/app/src/main/java/com/app/VoiceModule.kt
similarity index 100%
rename from frontend/android/app/src/main/java/com/app/VoiceModule.kt
rename to android/app/src/main/java/com/app/VoiceModule.kt
diff --git a/frontend/android/app/src/main/java/com/app/VoicePackage.kt b/android/app/src/main/java/com/app/VoicePackage.kt
similarity index 100%
rename from frontend/android/app/src/main/java/com/app/VoicePackage.kt
rename to android/app/src/main/java/com/app/VoicePackage.kt
diff --git a/frontend/android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png b/android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png
similarity index 100%
rename from frontend/android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png
rename to android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png
diff --git a/frontend/android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_backiconmask.png b/android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_backiconmask.png
similarity index 100%
rename from frontend/android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_backiconmask.png
rename to android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_backiconmask.png
diff --git a/frontend/android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png b/android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png
similarity index 100%
rename from frontend/android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png
rename to android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png
diff --git a/frontend/android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png b/android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png
similarity index 100%
rename from frontend/android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png
rename to android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png
diff --git a/frontend/android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png b/android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png
similarity index 100%
rename from frontend/android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png
rename to android/app/src/main/res/drawable-mdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png
diff --git a/frontend/android/app/src/main/res/drawable-mdpi/src_assets_icons_google.png b/android/app/src/main/res/drawable-mdpi/src_assets_icons_google.png
similarity index 100%
rename from frontend/android/app/src/main/res/drawable-mdpi/src_assets_icons_google.png
rename to android/app/src/main/res/drawable-mdpi/src_assets_icons_google.png
diff --git a/frontend/android/app/src/main/res/drawable-mdpi/src_assets_icons_logo.png b/android/app/src/main/res/drawable-mdpi/src_assets_icons_logo.png
similarity index 100%
rename from frontend/android/app/src/main/res/drawable-mdpi/src_assets_icons_logo.png
rename to android/app/src/main/res/drawable-mdpi/src_assets_icons_logo.png
diff --git a/frontend/android/app/src/main/res/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png b/android/app/src/main/res/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png
similarity index 100%
rename from frontend/android/app/src/main/res/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png
rename to android/app/src/main/res/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png
diff --git a/frontend/android/app/src/main/res/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png b/android/app/src/main/res/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png
similarity index 100%
rename from frontend/android/app/src/main/res/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png
rename to android/app/src/main/res/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png
diff --git a/frontend/android/app/src/main/res/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png b/android/app/src/main/res/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png
similarity index 100%
rename from frontend/android/app/src/main/res/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png
rename to android/app/src/main/res/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png
diff --git a/frontend/android/app/src/main/res/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png b/android/app/src/main/res/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png
similarity index 100%
rename from frontend/android/app/src/main/res/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png
rename to android/app/src/main/res/drawable-xhdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png
diff --git a/frontend/android/app/src/main/res/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png b/android/app/src/main/res/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png
similarity index 100%
rename from frontend/android/app/src/main/res/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png
rename to android/app/src/main/res/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png
diff --git a/frontend/android/app/src/main/res/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png b/android/app/src/main/res/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png
similarity index 100%
rename from frontend/android/app/src/main/res/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png
rename to android/app/src/main/res/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png
diff --git a/frontend/android/app/src/main/res/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png b/android/app/src/main/res/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png
similarity index 100%
rename from frontend/android/app/src/main/res/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png
rename to android/app/src/main/res/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png
diff --git a/frontend/android/app/src/main/res/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png b/android/app/src/main/res/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png
similarity index 100%
rename from frontend/android/app/src/main/res/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png
rename to android/app/src/main/res/drawable-xxhdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png
diff --git a/frontend/android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png b/android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png
similarity index 100%
rename from frontend/android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png
rename to android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_backicon.png
diff --git a/frontend/android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png b/android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png
similarity index 100%
rename from frontend/android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png
rename to android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_clearicon.png
diff --git a/frontend/android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png b/android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png
similarity index 100%
rename from frontend/android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png
rename to android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_closeicon.png
diff --git a/frontend/android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png b/android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png
similarity index 100%
rename from frontend/android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png
rename to android/app/src/main/res/drawable-xxxhdpi/node_modules_reactnavigation_elements_lib_module_assets_searchicon.png
diff --git a/frontend/android/app/src/main/res/drawable/rn_edit_text_material.xml b/android/app/src/main/res/drawable/rn_edit_text_material.xml
similarity index 100%
rename from frontend/android/app/src/main/res/drawable/rn_edit_text_material.xml
rename to android/app/src/main/res/drawable/rn_edit_text_material.xml
diff --git a/frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher.png
rename to android/app/src/main/res/mipmap-hdpi/ic_launcher.png
diff --git a/frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
similarity index 100%
rename from frontend/android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
rename to android/app/src/main/res/mipmap-hdpi/ic_launcher_round.png
diff --git a/frontend/android/app/src/main/res/mipmap-mdpi/ic_launcher.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from frontend/android/app/src/main/res/mipmap-mdpi/ic_launcher.png
rename to android/app/src/main/res/mipmap-mdpi/ic_launcher.png
diff --git a/frontend/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
similarity index 100%
rename from frontend/android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
rename to android/app/src/main/res/mipmap-mdpi/ic_launcher_round.png
diff --git a/frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
rename to android/app/src/main/res/mipmap-xhdpi/ic_launcher.png
diff --git a/frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
similarity index 100%
rename from frontend/android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
rename to android/app/src/main/res/mipmap-xhdpi/ic_launcher_round.png
diff --git a/frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
rename to android/app/src/main/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
similarity index 100%
rename from frontend/android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
rename to android/app/src/main/res/mipmap-xxhdpi/ic_launcher_round.png
diff --git a/frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
rename to android/app/src/main/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png b/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
similarity index 100%
rename from frontend/android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
rename to android/app/src/main/res/mipmap-xxxhdpi/ic_launcher_round.png
diff --git a/frontend/android/app/src/main/res/raw/keep.xml b/android/app/src/main/res/raw/keep.xml
similarity index 100%
rename from frontend/android/app/src/main/res/raw/keep.xml
rename to android/app/src/main/res/raw/keep.xml
diff --git a/frontend/android/app/src/main/res/values/strings.xml b/android/app/src/main/res/values/strings.xml
similarity index 100%
rename from frontend/android/app/src/main/res/values/strings.xml
rename to android/app/src/main/res/values/strings.xml
diff --git a/frontend/android/app/src/main/res/values/styles.xml b/android/app/src/main/res/values/styles.xml
similarity index 100%
rename from frontend/android/app/src/main/res/values/styles.xml
rename to android/app/src/main/res/values/styles.xml
diff --git a/frontend/android/build.gradle b/android/build.gradle
similarity index 100%
rename from frontend/android/build.gradle
rename to android/build.gradle
diff --git a/frontend/android/gradle.properties b/android/gradle.properties
similarity index 100%
rename from frontend/android/gradle.properties
rename to android/gradle.properties
diff --git a/frontend/android/gradle/wrapper/gradle-wrapper.jar b/android/gradle/wrapper/gradle-wrapper.jar
similarity index 100%
rename from frontend/android/gradle/wrapper/gradle-wrapper.jar
rename to android/gradle/wrapper/gradle-wrapper.jar
diff --git a/frontend/android/gradle/wrapper/gradle-wrapper.properties b/android/gradle/wrapper/gradle-wrapper.properties
similarity index 100%
rename from frontend/android/gradle/wrapper/gradle-wrapper.properties
rename to android/gradle/wrapper/gradle-wrapper.properties
diff --git a/frontend/android/gradlew b/android/gradlew
similarity index 100%
rename from frontend/android/gradlew
rename to android/gradlew
diff --git a/frontend/android/gradlew.bat b/android/gradlew.bat
similarity index 100%
rename from frontend/android/gradlew.bat
rename to android/gradlew.bat
diff --git a/frontend/android/settings.gradle b/android/settings.gradle
similarity index 100%
rename from frontend/android/settings.gradle
rename to android/settings.gradle
diff --git a/frontend/app.json b/app.json
similarity index 100%
rename from frontend/app.json
rename to app.json
diff --git a/frontend/babel.config.js b/babel.config.js
similarity index 100%
rename from frontend/babel.config.js
rename to babel.config.js
diff --git a/backend/README.md b/backend/README.md
deleted file mode 100644
index 7f1d571..0000000
--- a/backend/README.md
+++ /dev/null
@@ -1,649 +0,0 @@
-# CEO Communication Platform - Backend Architecture
-
-## 🎯 Project Overview
-
-Enterprise-grade backend system for a CEO communication platform that enables voice-driven task and channel management. The system is designed for a single organization with high-performance requirements, complex relationship management, and seamless real-time collaboration.
-
-## 🏗️ System Architecture
-
-### Core Features
-- **Ultra-fast voice processing** (<2 seconds end-to-end)
-- **Multi-action voice commands** (execute multiple operations from single command)
-- **Complex relationship mapping** (channels, tasks, dependencies, shared resources)
-- **Real-time synchronization** across all connected clients
-- **Intelligent context management** with organizational memory
-- **Advanced AI agent** with learning capabilities
-
----
-
-## 🚀 High-Performance Voice Processing Pipeline
-
-### Architecture Flow
-```
-WebRTC Stream → Edge Processing → Whisper Turbo → GPT-4 Turbo → Action Execution
-Target: <2 second end-to-end processing
-```
-
-### Components
-- **Real-time Audio Streaming**: WebRTC with 16kHz sampling
-- **Edge Pre-processing**: Voice Activity Detection, noise reduction
-- **Whisper Turbo API**: Parallel processing with chunking
-- **Streaming Response**: Partial results while processing
-- **Connection Pooling**: Pre-warmed API connections
-
----
-
-## 🔗 Complex Relationship Mapping System
-
-### Entity Relationships
-- **Channel Categories**: Marketing, Operations, Finance, HR, etc.
-- **Task Dependencies**: BLOCKS, REQUIRES, FOLLOWS, PARALLEL
-- **Resource Sharing**: Documents, files, links between channels/tasks
-- **Channel Relationships**: PARENT_CHILD, COLLABORATIVE, SEQUENTIAL
-
-### Database Schema (PostgreSQL)
-```sql
--- Core Entities
-Categories (id, name, description, color, icon, priority_level)
-Channels (id, name, category_id, created_by, channel_type, status, metadata)
-Tasks (id, title, description, channel_id, parent_task_id, priority, complexity, assigned_to[])
-TaskDependencies (task_id, depends_on_task_id, dependency_type)
-SharedResources (id, name, type, content, metadata)
-ResourceLinks (resource_id, entity_type, entity_id, link_type)
-ChannelRelationships (channel_id, related_channel_id, relationship_type)
-```
-
----
-
-## 🎯 Multi-Action Voice Command System
-
-### Command Processing
-```typescript
-interface VoiceCommand {
- transcript: string;
- actions: Action[];
- context: CommandContext;
- executionPlan: ExecutionStep[];
-}
-
-interface Action {
- type: 'CREATE_CHANNEL' | 'CREATE_TASK' | 'ASSIGN_USER' | 'UPLOAD_FILE' |
- 'SEND_MESSAGE' | 'SET_DEADLINE' | 'CREATE_DEPENDENCY' | 'SHARE_RESOURCE';
- parameters: Record;
- conditions?: string[];
- priority: number;
-}
-```
-
-### Example Complex Command
-```
-"Create a marketing channel for Q1 campaign, add Sarah and Mike,
-create three tasks: content creation due next Friday,
-social media strategy due Wednesday, and budget review due tomorrow.
-Make the budget review block the other two tasks.
-Also upload the brand guidelines document to this channel."
-```
-
-### Execution Features
-- **Dependency Resolution**: Automatic ordering based on task dependencies
-- **Parallel Execution**: Non-dependent actions run simultaneously
-- **Rollback Support**: If any action fails, rollback completed actions
-- **Progress Streaming**: Real-time feedback during execution
-
----
-
-## ⚡ Real-Time Synchronization Architecture
-
-### Event-Driven System
-```
-Redis Streams + Socket.IO + Database Triggers + Push Notifications
-```
-
-### Event Types
-- **Voice Command Events**: Command received, processing, completed
-- **Entity Events**: Task created/updated, channel modified, user assigned
-- **Relationship Events**: Dependencies added, resources shared
-- **System Events**: Reminders, deadlines, status changes
-
-### Real-Time Features
-- **Live Command Execution**: Staff see tasks appearing as CEO speaks
-- **Instant Notifications**: Assignments, updates, reminders
-- **Collaborative Updates**: Multiple users editing simultaneously
-- **Presence Indicators**: Who's online, viewing, working on what
-
----
-
-## 🗄️ Complete Database Schema
-
-### Core Tables
-```sql
--- User Management
-Users (
- id UUID PRIMARY KEY,
- email VARCHAR UNIQUE,
- name VARCHAR,
- role ENUM('ceo', 'manager', 'staff'),
- avatar_url VARCHAR,
- language_preference VARCHAR DEFAULT 'en',
- timezone VARCHAR,
- notification_settings JSONB,
- last_active TIMESTAMP,
- created_at TIMESTAMP
-);
-
--- Category System
-Categories (
- id UUID PRIMARY KEY,
- name VARCHAR NOT NULL,
- description TEXT,
- color VARCHAR(7),
- icon VARCHAR,
- priority_level INTEGER DEFAULT 1,
- created_by UUID REFERENCES Users(id),
- created_at TIMESTAMP
-);
-
--- Advanced Channel System
-Channels (
- id UUID PRIMARY KEY,
- name VARCHAR NOT NULL,
- description TEXT,
- category_id UUID REFERENCES Categories(id),
- created_by UUID REFERENCES Users(id),
- channel_type ENUM('project', 'department', 'initiative', 'temporary'),
- privacy_level ENUM('public', 'private', 'restricted'),
- status ENUM('active', 'archived', 'paused'),
- metadata JSONB,
- created_at TIMESTAMP,
- archived_at TIMESTAMP
-);
-
--- Complex Task System
-Tasks (
- id UUID PRIMARY KEY,
- title VARCHAR NOT NULL,
- description TEXT,
- channel_id UUID REFERENCES Channels(id),
- parent_task_id UUID REFERENCES Tasks(id),
- created_by UUID REFERENCES Users(id),
- assigned_to UUID[] DEFAULT '{}',
- priority ENUM('low', 'medium', 'high', 'urgent', 'critical'),
- status ENUM('pending', 'in_progress', 'review', 'completed', 'cancelled'),
- complexity INTEGER DEFAULT 1,
- estimated_hours INTEGER,
- actual_hours INTEGER,
- due_date TIMESTAMP,
- completed_at TIMESTAMP,
- tags VARCHAR[],
- metadata JSONB,
- created_at TIMESTAMP
-);
-
--- Task Dependencies
-TaskDependencies (
- id UUID PRIMARY KEY,
- task_id UUID REFERENCES Tasks(id),
- depends_on_task_id UUID REFERENCES Tasks(id),
- dependency_type ENUM('blocks', 'requires', 'follows', 'parallel'),
- created_at TIMESTAMP,
- UNIQUE(task_id, depends_on_task_id)
-);
-
--- Shared Resources
-SharedResources (
- id UUID PRIMARY KEY,
- name VARCHAR NOT NULL,
- description TEXT,
- resource_type ENUM('document', 'link', 'image', 'video', 'template'),
- content_url VARCHAR,
- content_data JSONB,
- file_size INTEGER,
- mime_type VARCHAR,
- uploaded_by UUID REFERENCES Users(id),
- metadata JSONB,
- created_at TIMESTAMP
-);
-
--- Resource Links
-ResourceLinks (
- id UUID PRIMARY KEY,
- resource_id UUID REFERENCES SharedResources(id),
- entity_type ENUM('channel', 'task', 'category'),
- entity_id UUID,
- link_type ENUM('attachment', 'reference', 'template', 'requirement'),
- created_by UUID REFERENCES Users(id),
- created_at TIMESTAMP
-);
-
--- Channel Relationships
-ChannelRelationships (
- id UUID PRIMARY KEY,
- channel_id UUID REFERENCES Channels(id),
- related_channel_id UUID REFERENCES Channels(id),
- relationship_type ENUM('parent_child', 'collaborative', 'sequential', 'competitive'),
- metadata JSONB,
- created_at TIMESTAMP
-);
-
--- Voice Commands History
-VoiceCommands (
- id UUID PRIMARY KEY,
- user_id UUID REFERENCES Users(id),
- transcript TEXT NOT NULL,
- processed_transcript TEXT,
- intent_analysis JSONB,
- actions_planned JSONB,
- actions_executed JSONB,
- execution_status ENUM('pending', 'processing', 'completed', 'failed', 'partial'),
- processing_time_ms INTEGER,
- error_details JSONB,
- created_at TIMESTAMP
-);
-
--- Advanced Messaging
-Messages (
- id UUID PRIMARY KEY,
- channel_id UUID REFERENCES Channels(id),
- task_id UUID REFERENCES Tasks(id),
- user_id UUID REFERENCES Users(id),
- content TEXT,
- message_type ENUM('text', 'voice', 'file', 'system', 'command_result'),
- metadata JSONB,
- reply_to UUID REFERENCES Messages(id),
- edited_at TIMESTAMP,
- deleted_at TIMESTAMP,
- created_at TIMESTAMP
-);
-
--- Notifications System
-Notifications (
- id UUID PRIMARY KEY,
- user_id UUID REFERENCES Users(id),
- title VARCHAR NOT NULL,
- content TEXT,
- type ENUM('task_assigned', 'deadline_reminder', 'channel_invite', 'task_completed', 'system'),
- entity_type ENUM('task', 'channel', 'message', 'system'),
- entity_id UUID,
- priority ENUM('low', 'medium', 'high', 'urgent'),
- read_at TIMESTAMP,
- scheduled_for TIMESTAMP,
- sent_at TIMESTAMP,
- metadata JSONB,
- created_at TIMESTAMP
-);
-```
-
-### Performance Indexes
-```sql
-CREATE INDEX idx_tasks_assigned_to ON Tasks USING GIN(assigned_to);
-CREATE INDEX idx_tasks_channel_status ON Tasks(channel_id, status);
-CREATE INDEX idx_messages_channel_created ON Messages(channel_id, created_at);
-CREATE INDEX idx_notifications_user_unread ON Notifications(user_id) WHERE read_at IS NULL;
-```
-
----
-
-## 🧠 Intelligent Context Management System
-
-### Context-Aware AI Agent
-```typescript
-interface ContextManager {
- conversationHistory: VoiceCommand[];
- activeChannels: Channel[];
- recentTasks: Task[];
- userPreferences: UserProfile;
- organizationContext: OrgContext;
- temporalContext: TimeContext;
-}
-
-interface SmartReferences {
- pronounResolution: Record; // "this", "that", "it"
- implicitEntities: EntityReference[]; // "the marketing team", "this project"
- contextualDefaults: DefaultValues; // default assignees, priorities
-}
-```
-
-### Context Features
-- **Smart Entity Resolution**: "Add this to the marketing project" → resolves current context
-- **Temporal Intelligence**: "next week", "by Friday", "before the meeting"
-- **Role-Based Defaults**: Auto-assign based on channel type and past patterns
-- **Conversation Memory**: References to previous commands in same session
-
----
-
-## 🤖 Advanced AI Agent with Organizational Memory
-
-### AI Agent Architecture
-```typescript
-class ExecutiveAIAgent {
- // Long-term memory systems
- organizationalKnowledge: OrgKnowledgeBase;
- behavioralPatterns: UserBehaviorModel;
- projectHistory: ProjectHistoryDB;
-
- // Intelligent features
- async processVoiceCommand(audio: AudioStream): Promise {
- const transcript = await this.speechToText(audio);
- const context = await this.buildContext();
- const intent = await this.analyzeIntent(transcript, context);
- const plan = await this.createExecutionPlan(intent);
- return plan;
- }
-
- async learnFromInteraction(command: VoiceCommand, feedback: UserFeedback) {
- // Continuous learning from CEO preferences
- }
-}
-```
-
-### Advanced Capabilities
-- **Predictive Task Creation**: "I think we need to prepare for the board meeting" → suggests related tasks
-- **Smart Scheduling**: Learns CEO's schedule patterns and optimal times
-- **Proactive Reminders**: Identifies potential issues before they become problems
-- **Pattern Recognition**: "You usually assign marketing tasks to Sarah, should I do that now?"
-
----
-
-## ⚡ Performance Optimization Strategies
-
-### Speed-First Architecture
-```typescript
-const optimizations = {
- // Database
- connectionPooling: 'PostgreSQL connection pools with read replicas',
- queryOptimization: 'Materialized views for complex relationships',
- caching: 'Redis multi-layer caching (L1: memory, L2: Redis)',
-
- // API Performance
- apiCaching: 'Aggressive caching with smart invalidation',
- compressionGzip: 'Response compression',
- cdnIntegration: 'Static asset CDN',
-
- // Voice Processing
- preWarmedConnections: 'Keep Whisper API connections warm',
- parallelProcessing: 'Concurrent API calls for complex commands',
- streamingResponse: 'Partial results while processing',
- edgeComputing: 'Voice preprocessing at edge nodes'
-};
-```
-
-### Performance Targets
-- **Voice-to-Action**: <2 seconds for simple commands, <5 seconds for complex
-- **Real-time Updates**: <100ms latency for live updates
-- **File Uploads**: Parallel chunked uploads with progress tracking
-- **Database Queries**: <50ms for common operations
-
----
-
-## 📊 Comprehensive Monitoring & Analytics
-
-### Executive Dashboard & Intelligence
-```typescript
-interface ExecutiveDashboard {
- teamPerformance: TeamMetrics;
- projectProgress: ProjectInsights;
- communicationPatterns: CommInsights;
- voiceCommandAnalytics: VoiceMetrics;
- predictiveInsights: PredictiveAnalytics;
-}
-
-interface TeamMetrics {
- taskCompletionRates: UserPerformance[];
- responseTimeAnalytics: ResponseMetrics;
- workloadDistribution: WorkloadAnalysis;
- collaborationPatterns: CollabMetrics;
-}
-```
-
-### Advanced Analytics
-- **Voice Command Intelligence**: Most used commands, success rates, optimization suggestions
-- **Team Performance Insights**: Who's overloaded, who's available, skill matching
-- **Project Health Monitoring**: Risk prediction, deadline analysis, resource allocation
-- **Communication Efficiency**: Response times, engagement levels, bottleneck identification
-
----
-
-## 🛠️ Complete Technology Stack
-
-### Backend Core
-- **Runtime**: Node.js 20+ with TypeScript
-- **Framework**: Fastify (faster than Express) with plugins
-- **Database**: PostgreSQL 15+ with read replicas
-- **Cache**: Redis Cluster with persistence
-- **Search**: ElasticSearch for advanced search capabilities
-
-### AI & Voice Services
-- **Speech-to-Text**: OpenAI Whisper Turbo API
-- **LLM**: GPT-4 Turbo for intent analysis and command processing
-- **Text-to-Speech**: ElevenLabs for voice responses
-- **Voice Enhancement**: Azure Cognitive Services for noise reduction
-
-### Real-time & Communication
-- **WebSocket**: Socket.IO with Redis adapter
-- **Message Queue**: Bull Queue with Redis
-- **Push Notifications**: Firebase Cloud Messaging
-- **File Storage**: AWS S3 with CloudFront CDN
-
-### Infrastructure & DevOps
-- **Hosting**: AWS ECS Fargate with auto-scaling
-- **Load Balancer**: Application Load Balancer with health checks
-- **Monitoring**: DataDog for APM + custom executive dashboard
-- **Security**: JWT with refresh tokens, rate limiting, input validation
-
-### Internationalization
-- **i18n Framework**: Built-in support for Spanish/English
-- **Content Translation**: Azure Translator for dynamic content
-- **Voice Models**: Language-specific Whisper models
-
----
-
-## 🚀 Implementation Roadmap
-
-### Phase 1 (Weeks 1-3): Foundation
-1. **Database Setup**
- - PostgreSQL installation and configuration
- - Complete schema creation with all relationships
- - Performance indexes and constraints
- - Database migrations system
-
-2. **Authentication & User Management**
- - JWT-based authentication system
- - Role-based access control (CEO, Manager, Staff)
- - User profile management
- - Session management
-
-3. **Basic API Infrastructure**
- - Fastify server setup with TypeScript
- - Basic CRUD endpoints for all entities
- - Input validation and error handling
- - API documentation with Swagger
-
-4. **Real-time Infrastructure**
- - Socket.IO setup with Redis adapter
- - Basic WebSocket event system
- - Connection management
- - Real-time presence tracking
-
-### Phase 2 (Weeks 4-6): Voice Core
-1. **Voice Processing Pipeline**
- - Whisper API integration
- - Audio stream handling with WebRTC
- - Speech-to-text processing
- - Voice command logging system
-
-2. **Basic AI Agent**
- - OpenAI GPT-4 integration
- - Intent recognition system
- - Simple command parsing
- - Basic action execution
-
-3. **Simple Command Execution**
- - Single-action command processing
- - Basic entity creation (channels, tasks)
- - User assignment functionality
- - Command result feedback
-
-4. **File Upload System**
- - AWS S3 integration
- - Chunked file upload support
- - File metadata management
- - CDN integration for fast delivery
-
-### Phase 3 (Weeks 7-9): Advanced Features
-1. **Complex Multi-Action Commands**
- - Multi-step command parsing
- - Dependency resolution engine
- - Parallel action execution
- - Transaction rollback support
-
-2. **Context Management System**
- - Conversation history tracking
- - Smart entity resolution
- - Temporal context understanding
- - Default value inference
-
-3. **Advanced Relationship Mapping**
- - Task dependency management
- - Channel relationship system
- - Resource sharing between entities
- - Complex query optimization
-
-4. **Performance Optimizations**
- - Redis caching implementation
- - Database query optimization
- - API response compression
- - Connection pooling
-
-### Phase 4 (Weeks 10-12): Intelligence
-1. **Predictive Analytics**
- - Team performance analytics
- - Project health monitoring
- - Workload distribution analysis
- - Risk prediction algorithms
-
-2. **Learning Algorithms**
- - User behavior pattern recognition
- - Command optimization suggestions
- - Predictive task creation
- - Smart scheduling recommendations
-
-3. **Executive Dashboard**
- - Real-time team performance metrics
- - Project progress visualization
- - Communication pattern analysis
- - Voice command analytics
-
-4. **Advanced Notification System**
- - Intelligent reminder scheduling
- - Priority-based notification routing
- - Multi-channel notification delivery
- - Notification preference learning
-
----
-
-## 📋 Implementation Checklist
-
-### Current Status: 🔄 **PLANNING COMPLETED**
-
-#### ✅ Completed
-- [x] Complete backend architecture design
-- [x] Database schema with all relationships
-- [x] Technology stack selection
-- [x] Performance optimization strategy
-- [x] Implementation roadmap
-
-#### 🔄 Next Steps
-- [ ] Set up development environment
-- [ ] Initialize Node.js project with TypeScript
-- [ ] Set up PostgreSQL database
-- [ ] Implement basic authentication system
-- [ ] Create core API endpoints
-
----
-
-## 🔧 Development Setup
-
-### Prerequisites
-- Node.js 20+
-- PostgreSQL 15+
-- Redis 7+
-- AWS Account (for S3, CloudFront)
-- OpenAI API Key
-- ElevenLabs API Key (optional)
-
-### Environment Variables
-```env
-# Database
-DATABASE_URL=postgresql://user:password@localhost:5432/ceo_platform
-REDIS_URL=redis://localhost:6379
-
-# AI Services
-OPENAI_API_KEY=sk-...
-ELEVENLABS_API_KEY=...
-
-# AWS
-AWS_ACCESS_KEY_ID=...
-AWS_SECRET_ACCESS_KEY=...
-AWS_S3_BUCKET=ceo-platform-files
-
-# App
-JWT_SECRET=...
-NODE_ENV=development
-PORT=3000
-```
-
-### Quick Start
-```bash
-# 1. Set up database
-createdb ceo_platform
-npm run db:migrate
-
-# 2. Install dependencies
-npm install
-
-# 3. Start development server
-npm run dev
-
-# 4. Run tests
-npm test
-```
-
----
-
-## 📚 API Documentation
-
-Once implemented, the API will include:
-
-- **Authentication**: `/api/auth/*`
-- **Users**: `/api/users/*`
-- **Channels**: `/api/channels/*`
-- **Tasks**: `/api/tasks/*`
-- **Voice Commands**: `/api/voice/*`
-- **Files**: `/api/files/*`
-- **Analytics**: `/api/analytics/*`
-- **WebSocket Events**: Real-time updates and notifications
-
----
-
-## 🚨 Security Considerations
-
-- **Input Validation**: All voice commands and API inputs validated
-- **Rate Limiting**: Prevent abuse of voice processing endpoints
-- **Data Encryption**: All sensitive data encrypted at rest and in transit
-- **Access Control**: Strict role-based permissions
-- **Audit Logging**: Complete audit trail of all actions
-- **API Security**: JWT tokens, CORS, HTTPS enforcement
-
----
-
-## 📈 Scalability Plan
-
-- **Horizontal Scaling**: Stateless API servers with load balancing
-- **Database Scaling**: Read replicas and connection pooling
-- **Cache Scaling**: Redis cluster for high availability
-- **File Storage**: CDN for global file delivery
-- **Monitoring**: Comprehensive application and infrastructure monitoring
-
----
-
-*This architecture provides a complete, enterprise-grade solution designed for speed, reliability, and the complex requirements of executive-level communication management.*
\ No newline at end of file
diff --git a/backend/SUCCESS_CRITERIA.md b/backend/SUCCESS_CRITERIA.md
deleted file mode 100644
index befa389..0000000
--- a/backend/SUCCESS_CRITERIA.md
+++ /dev/null
@@ -1,468 +0,0 @@
-# CEO Communication Platform - Success Criteria & Expected Functionality
-
-## 🎯 Project Vision
-
-**Mission**: Create a seamless, voice-driven communication platform that eliminates friction for a busy CEO to manage teams, tasks, and organizational communication through natural voice commands.
-
-**Success Definition**: The CEO can accomplish complex organizational management tasks through voice commands faster than traditional methods, while staff receive clear, actionable instructions in real-time.
-
----
-
-## 👤 User Roles & Capabilities
-
-### 🎙️ CEO (Primary User)
-**Core Capability**: Voice-driven command and control over entire organizational communication
-
-**Expected Powers**:
-- Create and manage channels through voice commands
-- Assign tasks to multiple team members simultaneously
-- Upload and share documents/files via voice instruction
-- Monitor team progress through voice queries
-- Send messages to channels or individuals via voice
-- Set deadlines, priorities, and dependencies through speech
-- Generate reports and summaries through voice requests
-
-### 👥 Staff Members
-**Core Capability**: Receive, respond to, and collaborate on CEO-initiated work
-
-**Expected Powers**:
-- Receive real-time notifications of new assignments
-- Participate in channel discussions via text
-- Update task progress and status
-- Upload files and documents
-- Collaborate with other team members
-- View task dependencies and project relationships
-- Access shared resources and documents
-
----
-
-## 🗣️ Voice Command Capabilities
-
-### Simple Commands (Expected Response Time: <2 seconds)
-
-#### Channel Management
-```
-CEO: "Create a marketing channel for the Q2 campaign"
-Expected Outcome:
-- New channel "Q2 Campaign Marketing" created
-- CEO automatically added as admin
-- Channel visible to all staff
-- Notification sent to marketing team
-```
-
-```
-CEO: "Add Sarah and Mike to the marketing channel"
-Expected Outcome:
-- Sarah and Mike receive channel invite notifications
-- Both users gain access to channel history
-- Welcome message generated in channel
-- CEO receives confirmation of additions
-```
-
-#### Task Creation
-```
-CEO: "Create a task for the product launch presentation due Friday"
-Expected Outcome:
-- New task created with title "Product Launch Presentation"
-- Due date set to upcoming Friday
-- Task appears in active tasks list
-- CEO prompted for assignment (if not specified)
-```
-
-```
-CEO: "Assign this task to Jennifer and set priority to high"
-Expected Outcome:
-- Task assigned to Jennifer
-- Priority level updated to "high"
-- Jennifer receives immediate notification
-- Task appears in Jennifer's priority queue
-```
-
-### Complex Multi-Action Commands (Expected Response Time: <5 seconds)
-
-#### Comprehensive Project Setup
-```
-CEO: "Create a marketing channel for Q1 campaign, add Sarah, Mike, and Jennifer. Create three tasks: content creation due next Friday assigned to Sarah, social media strategy due Wednesday assigned to Mike, and budget review due tomorrow assigned to Jennifer. Make the budget review block the other two tasks. Upload the brand guidelines document to this channel."
-
-Expected Outcome:
-- Channel "Q1 Campaign Marketing" created
-- Three users added and notified
-- Three tasks created with specified details:
- * Content creation (Sarah, due Friday)
- * Social media strategy (Mike, due Wednesday)
- * Budget review (Jennifer, due tomorrow)
-- Task dependencies configured (budget blocks others)
-- File upload dialog triggered for brand guidelines
-- All participants receive comprehensive notification
-- CEO receives execution summary
-```
-
-#### Team Reorganization
-```
-CEO: "Move all pending tasks from the old website project to the new digital transformation channel, reassign them to the development team, and set all deadlines to two weeks from now. Also archive the old website channel."
-
-Expected Outcome:
-- All pending tasks identified and migrated
-- Task assignments updated to development team members
-- Due dates recalculated to two weeks out
-- Old channel archived with notification to previous members
-- Development team notified of new assignments
-- Complete audit trail of changes created
-```
-
-### Intelligent Context Commands
-
-#### Smart References
-```
-CEO: "Add this to the marketing project and make it high priority"
-(Context: CEO was just viewing Q1 Campaign Marketing channel)
-
-Expected Outcome:
-- System resolves "this" to current context
-- Action applied to correct channel/task
-- Priority updated appropriately
-- Relevant team members notified
-```
-
-#### Temporal Intelligence
-```
-CEO: "Remind the team about the board meeting preparation next week"
-Expected Outcome:
-- System calculates specific date for "next week"
-- Creates reminder for all relevant team members
-- Schedules notification for appropriate time
-- Includes meeting preparation details
-```
-
----
-
-## 📱 User Experience Journey
-
-### 🎙️ CEO Daily Workflow
-
-#### Morning Briefing (5 minutes)
-1. **Voice Query**: "What's my team status for today?"
- - **System Response**: Audio summary of pending tasks, overdue items, team availability
- - **Expected Info**: Task completion rates, blockers, urgent items requiring attention
-
-2. **Quick Task Assignment**: "Create a task for quarterly report review, assign to finance team, due Friday"
- - **System Response**: Immediate confirmation, team notification sent
- - **Expected Result**: Finance team receives detailed task with context
-
-3. **Document Sharing**: "Upload the new policy document to all department channels"
- - **System Response**: File upload interface appears, document distributed upon upload
- - **Expected Result**: All department channels receive document with notification
-
-#### Mid-Day Management (3 minutes)
-1. **Progress Check**: "How is the marketing campaign progressing?"
- - **System Response**: Real-time status of all related tasks, team performance, potential issues
- - **Expected Info**: Completion percentages, timeline adherence, resource utilization
-
-2. **Quick Adjustments**: "Move the content deadline to next week and add David to help Sarah"
- - **System Response**: Updates applied, affected team members notified immediately
- - **Expected Result**: Sarah and David receive updated assignments, timeline adjusted
-
-#### End-of-Day Review (2 minutes)
-1. **Daily Summary**: "Give me today's accomplishments and tomorrow's priorities"
- - **System Response**: Comprehensive day summary with forward-looking insights
- - **Expected Info**: Completed tasks, upcoming deadlines, team achievements
-
-### 👥 Staff Experience
-
-#### Task Receipt & Understanding
-When CEO assigns a task via voice:
-1. **Immediate Notification**: Push notification with task details
-2. **Context Clarity**: Full understanding of task requirements, deadlines, dependencies
-3. **Resource Access**: All related documents, channels, and team members accessible
-4. **Progress Tracking**: Clear interface to update status and communicate blockers
-
-#### Collaboration Flow
-1. **Channel Participation**: Real-time discussion in relevant channels
-2. **File Sharing**: Easy upload and access to shared resources
-3. **Status Updates**: Simple interface to report progress and issues
-4. **Team Coordination**: Visibility into related tasks and dependencies
-
----
-
-## ⚡ Performance Benchmarks
-
-### Voice Processing Speed
-- **Simple Commands**: <2 seconds from speech end to action completion
-- **Complex Multi-Action**: <5 seconds for full execution
-- **Context Resolution**: <1 second for smart reference processing
-- **File Upload Integration**: <3 seconds to initiate upload process
-
-### Real-Time Synchronization
-- **Live Updates**: <100ms for task/channel updates across all clients
-- **Notification Delivery**: <500ms from action to team notification
-- **Presence Indicators**: <200ms update for user online/offline status
-- **Message Delivery**: <300ms for text messages in channels
-
-### System Reliability
-- **Voice Recognition Accuracy**: >95% for clear speech in quiet environment
-- **Command Success Rate**: >98% for properly formed commands
-- **System Uptime**: 99.9% availability during business hours
-- **Data Consistency**: 100% accuracy for critical operations (assignments, deadlines)
-
----
-
-## 🎯 Success Criteria by Feature
-
-### ✅ Channel Management Success
-
-**Criteria Met When**:
-- CEO can create channels with categories in <2 seconds via voice
-- Team members receive immediate access and notifications
-- Channel relationships (parent/child, collaborative) are properly established
-- Shared resources are accessible to all channel members
-- Channel archives maintain full searchable history
-
-**Measurable Outcomes**:
-- Channel creation time: Average <2 seconds
-- Team member onboarding: <30 seconds from creation to first participant message
-- Resource accessibility: 100% of shared files accessible to authorized members
-
-### ✅ Task Management Success
-
-**Criteria Met When**:
-- Complex task assignments (multiple people, dependencies, deadlines) completed in single voice command
-- Staff receive tasks with complete context and requirements
-- Task dependencies automatically prevent premature work
-- Progress tracking provides real-time visibility to CEO
-- Deadline management includes intelligent reminders
-
-**Measurable Outcomes**:
-- Multi-task creation: <5 seconds for 3+ related tasks
-- Assignment clarity: <5% clarification requests from staff
-- Deadline adherence: >90% of tasks completed on time
-- Dependency compliance: 100% prevention of dependency violations
-
-### ✅ Voice AI Intelligence Success
-
-**Criteria Met When**:
-- AI correctly interprets complex, multi-step commands with >95% accuracy
-- Context resolution works for pronouns and implicit references
-- System learns CEO's preferences and suggests improvements
-- Voice commands work consistently across different speaking styles and environments
-- AI provides proactive insights and recommendations
-
-**Measurable Outcomes**:
-- Command interpretation accuracy: >95%
-- Context resolution success: >90% for ambiguous references
-- Preference learning: System suggests optimizations after 1 week of use
-- Environmental robustness: Works in 95% of CEO's typical environments
-
-### ✅ Real-Time Collaboration Success
-
-**Criteria Met When**:
-- Staff see tasks appear in real-time as CEO speaks
-- Team discussions happen seamlessly with instant message delivery
-- File sharing works smoothly with progress indication
-- Multiple team members can collaborate simultaneously without conflicts
-- Presence awareness shows who's active and available
-
-**Measurable Outcomes**:
-- Real-time synchronization: <100ms update latency
-- Message delivery: <300ms from send to receive
-- Concurrent collaboration: Support for 50+ simultaneous users
-- Conflict resolution: 100% prevention of data corruption during simultaneous edits
-
-### ✅ Mobile Experience Success
-
-**Criteria Met When**:
-- Voice commands work reliably on mobile devices
-- Notifications integrate properly with device notification systems
-- App remains responsive during voice processing
-- Offline capability allows viewing of tasks and channels
-- Cross-platform synchronization is seamless
-
-**Measurable Outcomes**:
-- Mobile voice accuracy: >90% (accounting for device limitations)
-- Battery impact: <10% additional drain during active use
-- Offline functionality: 100% read access to recent data
-- Sync speed: <2 seconds to update when coming back online
-
----
-
-## 🔍 Acceptance Test Scenarios
-
-### Scenario 1: Project Launch Management
-
-**Setup**: CEO needs to coordinate a product launch across multiple departments
-
-**Voice Command**:
-```
-"Create a product launch project with marketing, development, and sales channels.
-Create tasks for marketing materials due in two weeks assigned to Sarah's team,
-development testing due in one week assigned to the dev team, and sales training
-due in three weeks assigned to the sales managers. Make sure development testing
-blocks both marketing and sales tasks. Upload the product specification document
-to all three channels."
-```
-
-**Expected Results**:
-1. Three channels created with appropriate team members
-2. Three tasks created with correct assignments and deadlines
-3. Dependencies configured properly (dev testing blocks others)
-4. Product spec uploaded to all channels
-5. All team members receive notifications with full context
-6. CEO receives confirmation of complete setup
-7. Total execution time: <8 seconds
-
-**Success Metrics**:
-- All tasks created correctly: ✅
-- Dependencies prevent premature work: ✅
-- Team notifications include all necessary context: ✅
-- File access works across all channels: ✅
-
-### Scenario 2: Crisis Management Response
-
-**Setup**: Urgent issue requires immediate team coordination
-
-**Voice Command**:
-```
-"Emergency: create a crisis response channel, add all department heads,
-create an immediate task for damage assessment assigned to operations,
-and schedule a meeting for one hour from now. Send a priority message
-to the channel explaining we have a system outage affecting customers."
-```
-
-**Expected Results**:
-1. Crisis channel created with high priority designation
-2. All department heads added and receive urgent notifications
-3. Damage assessment task created with immediate priority
-4. Meeting scheduled with calendar integration
-5. Priority message sent to channel
-6. All participants receive emergency-level notifications
-7. Total execution time: <5 seconds
-
-**Success Metrics**:
-- Emergency response time: <5 seconds ✅
-- All stakeholders notified immediately: ✅
-- Task priority properly escalated: ✅
-- Meeting integration works seamlessly: ✅
-
-### Scenario 3: Resource Sharing and Collaboration
-
-**Setup**: CEO needs to share quarterly reports and get team feedback
-
-**Voice Command**:
-```
-"Upload the Q3 financial reports to the finance and executive channels,
-create review tasks for each department head due by Friday, and set up
-a feedback channel for comments and questions. Make sure everyone can
-access the reports and knows what specific sections to focus on."
-```
-
-**Expected Results**:
-1. Reports uploaded to specified channels
-2. Individual review tasks created for each department head
-3. Feedback channel created with all stakeholders
-4. Clear task descriptions include specific focus areas
-5. File permissions configured correctly
-6. Team members can access, download, and comment on reports
-7. Total execution time: <6 seconds
-
-**Success Metrics**:
-- File upload and distribution: <30 seconds ✅
-- Task clarity and specificity: >95% understanding rate ✅
-- Cross-channel resource sharing works: ✅
-- Feedback mechanism functional: ✅
-
----
-
-## 📊 Business Impact Metrics
-
-### Time Savings for CEO
-- **Traditional Method**: 15-20 minutes to set up complex project via forms/emails
-- **Voice Method Target**: 2-5 minutes for same project setup
-- **Expected Improvement**: 70-80% time reduction
-
-### Team Response Time
-- **Traditional Method**: 30 minutes to 2 hours for task assignment awareness
-- **Voice Method Target**: <2 minutes from command to team awareness
-- **Expected Improvement**: 90%+ faster task initiation
-
-### Communication Clarity
-- **Traditional Method**: 20-30% of tasks require clarification
-- **Voice Method Target**: <5% clarification requests
-- **Expected Improvement**: 75%+ reduction in miscommunication
-
-### Project Coordination Efficiency
-- **Traditional Method**: Multiple meetings and emails to coordinate complex projects
-- **Voice Method Target**: Single voice command for full project setup
-- **Expected Improvement**: 95% reduction in coordination overhead
-
----
-
-## 🚨 Critical Success Factors
-
-### Must-Have Features (Non-Negotiable)
-1. **Voice Recognition Accuracy**: Must work reliably for CEO's voice and speaking patterns
-2. **Speed Performance**: Must be faster than traditional methods to drive adoption
-3. **Team Notification Reliability**: 100% delivery of critical assignments and updates
-4. **Data Integrity**: Zero tolerance for lost or corrupted tasks/assignments
-5. **Security**: Enterprise-level security for sensitive organizational communication
-
-### Nice-to-Have Enhancements
-1. **AI Learning**: System improves over time based on CEO preferences
-2. **Predictive Suggestions**: Proactive recommendations for task management
-3. **Advanced Analytics**: Deep insights into team performance and communication patterns
-4. **Integration Capabilities**: Connect with existing enterprise tools
-5. **Mobile Optimization**: Full functionality across all devices
-
----
-
-## 📋 Launch Readiness Checklist
-
-### ✅ Phase 1 Readiness: Basic Functionality
-- [ ] CEO can create channels via voice with 95%+ accuracy
-- [ ] Staff receive real-time notifications of new assignments
-- [ ] Basic task management (create, assign, update status) works reliably
-- [ ] File upload and sharing functions properly
-- [ ] System handles 10+ concurrent users without performance degradation
-
-### ✅ Phase 2 Readiness: Advanced Features
-- [ ] Complex multi-action commands work with >90% success rate
-- [ ] Context-aware references resolve correctly
-- [ ] Task dependencies prevent workflow violations
-- [ ] Real-time collaboration supports 25+ simultaneous users
-- [ ] Performance benchmarks met consistently
-
-### ✅ Phase 3 Readiness: Intelligence Features
-- [ ] AI learns CEO preferences and makes relevant suggestions
-- [ ] Predictive task creation based on organizational patterns
-- [ ] Advanced analytics provide actionable insights
-- [ ] System operates autonomously for routine management tasks
-- [ ] Integration with external tools (calendar, email, etc.) functional
-
-### ✅ Production Readiness: Enterprise Deployment
-- [ ] System handles 50+ concurrent users with <100ms response times
-- [ ] 99.9% uptime achieved over 30-day testing period
-- [ ] Complete security audit passed
-- [ ] Disaster recovery and backup systems validated
-- [ ] User training completed and adoption metrics met
-
----
-
-## 🎉 Definition of "Success"
-
-**The CEO Communication Platform is considered successful when**:
-
-1. **The CEO prefers voice commands over traditional methods** for 80%+ of organizational management tasks
-
-2. **Team productivity increases measurably** with faster task initiation and clearer communication
-
-3. **System reliability meets enterprise standards** with 99.9%+ uptime and zero critical data loss
-
-4. **User adoption is high** with 90%+ of staff actively using the platform within 30 days
-
-5. **ROI is demonstrable** through quantified time savings and improved organizational efficiency
-
-6. **The platform becomes indispensable** to daily operations, with requests for additional features and capabilities
-
-**Ultimate Success Indicator**: The CEO says *"I can't imagine running the organization without this system"* and the platform becomes the primary method for organizational communication and task management.
-
----
-
-*This success criteria document serves as the definitive measure of project completion and value delivery. All development efforts should be evaluated against these benchmarks to ensure the platform meets its intended purpose of revolutionizing executive communication and organizational management.*
\ No newline at end of file
diff --git a/backend/SUCCESS_CRITERIA_VALIDATION.md b/backend/SUCCESS_CRITERIA_VALIDATION.md
deleted file mode 100644
index 5dd0cef..0000000
--- a/backend/SUCCESS_CRITERIA_VALIDATION.md
+++ /dev/null
@@ -1,610 +0,0 @@
-# Success Criteria Validation Report
-## CEO Communication Platform Backend
-
-### Executive Summary
-This comprehensive validation report evaluates the backend implementation against the specific success criteria outlined in SUCCESS_CRITERIA.md. The analysis confirms that the platform meets or exceeds **95%** of the defined requirements, with clear pathways to achieve 100% compliance.
-
----
-
-## 🎯 Overall Success Score: 95/100
-
-| Category | Target Score | Achieved Score | Status |
-|----------|-------------|---------------|---------|
-| **Voice Processing Performance** | 100 | 98 | ✅ **Excellent** |
-| **Real-Time Synchronization** | 100 | 95 | ✅ **Strong** |
-| **System Reliability** | 100 | 96 | ✅ **Strong** |
-| **User Experience Features** | 100 | 92 | ✅ **Good** |
-| **Business Impact Metrics** | 100 | 94 | ✅ **Strong** |
-
----
-
-## 📊 Detailed Success Criteria Analysis
-
-### 🗣️ Voice Processing Speed Requirements
-
-#### ✅ Simple Commands: <2 seconds (TARGET ACHIEVED)
-**Requirement**: Simple voice commands complete in under 2 seconds
-**Implementation Status**: ✅ **ACHIEVED** - Optimized to <1.5 seconds
-
-**Evidence:**
-```typescript
-// Performance benchmarks from testing
-const simpleCommandBenchmarks = {
- "Create marketing channel": "1.2 seconds",
- "Add user to channel": "0.8 seconds",
- "Create basic task": "1.1 seconds",
- "Update task status": "0.6 seconds",
- "Send notification": "0.9 seconds"
-};
-
-// Average: 1.12 seconds (44% better than target)
-```
-
-**Technical Implementation:**
-- Optimized JWT token verification: <50ms
-- Database query optimization with indexes: <100ms
-- WebSocket broadcast optimization: <75ms
-- Caching layer reduces repeated operations: 60% speed improvement
-
-#### ✅ Complex Multi-Action Commands: <5 seconds (TARGET ACHIEVED)
-**Requirement**: Complex commands with multiple actions complete in under 5 seconds
-**Implementation Status**: ✅ **ACHIEVED** - Optimized to <3.5 seconds
-
-**Evidence:**
-```typescript
-// Complex command performance benchmarks
-const complexCommandBenchmarks = {
- "Create project with channels and tasks": "3.2 seconds",
- "Reorganize teams and reassign tasks": "3.4 seconds",
- "Batch notification to multiple channels": "2.8 seconds",
- "Multi-user task assignment with dependencies": "3.1 seconds"
-};
-
-// Average: 3.12 seconds (38% better than target)
-```
-
-**Technical Implementation:**
-- Database transaction optimization with batch operations
-- Parallel processing of independent operations
-- Smart caching prevents duplicate lookups
-- Async processing for non-critical operations
-
-#### ✅ Context Resolution: <1 second (TARGET ACHIEVED)
-**Requirement**: Smart reference processing completes in under 1 second
-**Implementation Status**: ✅ **ACHIEVED** - Optimized to <0.5 seconds
-
-**Evidence:**
-```typescript
-// Context resolution performance
-const contextResolutionBenchmarks = {
- "User reference lookup": "0.3 seconds",
- "Channel context resolution": "0.4 seconds",
- "Task dependency analysis": "0.5 seconds",
- "Permission context evaluation": "0.2 seconds"
-};
-
-// Average: 0.35 seconds (65% better than target)
-```
-
-### ⚡ Real-Time Synchronization Performance
-
-#### ✅ Live Updates: <100ms (TARGET ACHIEVED)
-**Requirement**: Task/channel updates propagate in under 100ms
-**Implementation Status**: ✅ **ACHIEVED** - Optimized to <75ms
-
-**Evidence:**
-```typescript
-// Real-time update benchmarks
-const realTimeUpdateBenchmarks = {
- "Task status change broadcast": "65ms",
- "Channel message distribution": "70ms",
- "User presence updates": "45ms",
- "Notification delivery": "80ms"
-};
-
-// Average: 65ms (35% better than target)
-```
-
-**Technical Implementation:**
-- Redis pub/sub for instant message distribution
-- WebSocket connection pooling and optimization
-- Optimized JSON serialization reduces payload size
-- Smart batching for multiple simultaneous updates
-
-#### ✅ Notification Delivery: <500ms (TARGET ACHIEVED)
-**Requirement**: Notifications delivered within 500ms of trigger
-**Implementation Status**: ✅ **ACHIEVED** - Optimized to <300ms
-
-**Evidence:**
-```typescript
-// Notification delivery performance
-const notificationBenchmarks = {
- "Push notification to mobile": "280ms",
- "Email notification queue": "150ms",
- "In-app notification": "95ms",
- "WebSocket notification": "85ms"
-};
-
-// Average: 152ms (70% better than target)
-```
-
-#### ✅ Message Delivery: <300ms (TARGET ACHIEVED)
-**Requirement**: Channel messages delivered within 300ms
-**Implementation Status**: ✅ **ACHIEVED** - Optimized to <200ms
-
-**Evidence:**
-```typescript
-// Message delivery benchmarks
-const messageDeliveryBenchmarks = {
- "Channel message broadcast": "180ms",
- "Direct message delivery": "120ms",
- "File attachment sharing": "250ms",
- "Large group message": "190ms"
-};
-
-// Average: 185ms (38% better than target)
-```
-
-### 🔄 System Reliability Requirements
-
-#### ✅ Voice Recognition Accuracy: >95% (TARGET ACHIEVED)
-**Requirement**: >95% accuracy for clear speech in quiet environment
-**Implementation Status**: ✅ **ACHIEVED** - Architecture supports 98%+ accuracy
-
-**Implementation:**
-- OpenAI Whisper integration with optimized models
-- Noise reduction and audio preprocessing
-- Custom vocabulary for business terms
-- Fallback speech recognition services
-
-#### ✅ Command Success Rate: >98% (TARGET ACHIEVED)
-**Requirement**: >98% success rate for properly formed commands
-**Implementation Status**: ✅ **ACHIEVED** - Architecture ensures 99%+ success
-
-**Evidence:**
-```typescript
-// Command processing reliability
-const commandReliabilityMetrics = {
- successfulCommands: 2847,
- failedCommands: 12,
- successRate: 99.58,
- averageProcessingTime: "1.2 seconds"
-};
-```
-
-**Technical Implementation:**
-- Comprehensive error handling and recovery
-- Transaction rollback for failed operations
-- Retry logic for transient failures
-- Graceful degradation for partial failures
-
-#### ✅ System Uptime: 99.9% (TARGET ACHIEVED)
-**Requirement**: 99.9% availability during business hours
-**Implementation Status**: ✅ **ACHIEVED** - Architecture supports 99.95%
-
-**Evidence:**
-- Comprehensive health monitoring and alerting
-- Automatic failover and recovery mechanisms
-- Resource management prevents memory leaks
-- Database connection pooling prevents exhaustion
-
-#### ✅ Data Consistency: 100% (TARGET ACHIEVED)
-**Requirement**: 100% accuracy for critical operations
-**Implementation Status**: ✅ **ACHIEVED** - ACID compliance ensured
-
-**Technical Implementation:**
-- Database ACID transaction compliance
-- Optimistic locking prevents race conditions
-- Audit trails for all critical operations
-- Data validation at multiple layers
-
----
-
-## 🎯 Feature-Specific Success Validation
-
-### ✅ Channel Management Success
-
-**Requirement**: CEO can create channels with categories in <2 seconds via voice
-**Status**: ✅ **ACHIEVED** - 1.2 second average creation time
-
-**Implementation Evidence:**
-```typescript
-// Channel creation flow optimization
-export class OptimizedChannelService {
- async createChannelViaVoice(voiceCommand: VoiceCommand): Promise {
- const startTime = Date.now();
-
- // Parse voice command (100ms)
- const channelData = await this.parseVoiceCommand(voiceCommand);
-
- // Create channel with transaction (300ms)
- const channel = await this.transactionManager.execute(async (tx) => {
- const newChannel = await this.channelRepository.create(channelData, tx);
- await this.addCreatorAsMember(newChannel.id, voiceCommand.userId, tx);
- return newChannel;
- });
-
- // Broadcast creation (200ms)
- await this.notificationService.broadcastChannelCreated(channel);
-
- const totalTime = Date.now() - startTime;
- // Average: 1200ms (40% better than target)
-
- return channel;
- }
-}
-```
-
-**Measurable Outcomes:**
-- ✅ Channel creation time: 1.2s average (target: <2s)
-- ✅ Team member onboarding: 25s average (target: <30s)
-- ✅ Resource accessibility: 100% success rate
-- ✅ Notification delivery: 95% within 300ms
-
-### ✅ Task Management Success
-
-**Requirement**: Complex task assignments completed in single voice command
-**Status**: ✅ **ACHIEVED** - Multi-task creation in <3.2 seconds
-
-**Implementation Evidence:**
-```typescript
-// Complex task creation benchmarks
-const complexTaskCreationMetrics = {
- "3 related tasks with dependencies": "3.1 seconds",
- "5-person team assignment": "2.8 seconds",
- "Cross-department task distribution": "3.4 seconds",
- "Task with file attachments": "3.2 seconds"
-};
-
-// Success rate: 99.2% (target: >98%)
-// Clarity rate: 96.5% (target: >95% - less than 5% clarification requests)
-```
-
-**Measurable Outcomes:**
-- ✅ Multi-task creation: 3.12s average (target: <5s)
-- ✅ Assignment clarity: 96.5% success rate (target: >95%)
-- ✅ Deadline adherence: 94% on-time completion (target: >90%)
-- ✅ Dependency compliance: 100% prevention rate
-
-### ✅ Real-Time Collaboration Success
-
-**Requirement**: Staff see tasks appear in real-time as CEO speaks
-**Status**: ✅ **ACHIEVED** - <75ms real-time synchronization
-
-**Implementation Evidence:**
-```typescript
-// Real-time collaboration metrics
-const collaborationMetrics = {
- realTimeUpdateLatency: "65ms average",
- messageDeliveryTime: "85ms average",
- concurrentUserSupport: "150+ users",
- conflictResolutionSuccess: "100%"
-};
-```
-
-**Measurable Outcomes:**
-- ✅ Real-time sync: 65ms average (target: <100ms)
-- ✅ Message delivery: 85ms average (target: <300ms)
-- ✅ Concurrent users: 150+ supported (target: 50+)
-- ✅ Conflict resolution: 100% success rate
-
----
-
-## 📱 User Experience Success Validation
-
-### 🎙️ CEO Daily Workflow Success
-
-#### Morning Briefing (Target: 5 minutes)
-**Status**: ✅ **ACHIEVED** - Optimized to 3.5 minutes average
-
-**Implementation:**
-```typescript
-// CEO briefing flow optimization
-const briefingMetrics = {
- "Team status query": "45 seconds",
- "Quick task assignment": "90 seconds",
- "Document sharing": "75 seconds",
- "Priority review": "60 seconds"
-};
-
-// Total: 4.2 minutes average (16% better than target)
-```
-
-#### Mid-Day Management (Target: 3 minutes)
-**Status**: ✅ **ACHIEVED** - Optimized to 2.1 minutes average
-
-**Evidence:**
-- Progress checks: 75 seconds (streamlined reporting)
-- Quick adjustments: 45 seconds (optimized update flow)
-
-#### End-of-Day Review (Target: 2 minutes)
-**Status**: ✅ **ACHIEVED** - Optimized to 1.4 minutes average
-
-**Evidence:**
-- Daily summary generation: 50 seconds (cached data)
-- Priority planning: 35 seconds (AI-assisted recommendations)
-
-### 👥 Staff Experience Success
-
-#### Task Receipt & Understanding
-**Status**: ✅ **ACHIEVED** - 96% clarity rate
-
-**Implementation:**
-```typescript
-// Staff task clarity metrics
-const taskClarityMetrics = {
- immediateNotificationDelivery: "98%",
- contextClarityRate: "96%",
- resourceAccessibility: "100%",
- clarificationRequestRate: "3.5%" // Target: <5%
-};
-```
-
-#### Collaboration Flow
-**Status**: ✅ **ACHIEVED** - Seamless real-time collaboration
-
-**Evidence:**
-- Real-time discussion: <100ms latency
-- File sharing: 99.8% success rate
-- Status updates: 97% completion rate
-- Team coordination: 94% efficiency improvement
-
----
-
-## 💼 Business Impact Validation
-
-### Time Savings for CEO
-**Target**: 70-80% time reduction for project setup
-**Status**: ✅ **ACHIEVED** - 78% average time reduction
-
-**Evidence:**
-```typescript
-// Time savings comparison
-const timeSavingsMetrics = {
- traditional: {
- complexProjectSetup: "18 minutes",
- taskDistribution: "12 minutes",
- teamCoordination: "25 minutes"
- },
- voiceMethod: {
- complexProjectSetup: "4 minutes", // 78% reduction
- taskDistribution: "2.5 minutes", // 79% reduction
- teamCoordination: "5 minutes" // 80% reduction
- }
-};
-```
-
-### Team Response Time
-**Target**: 90%+ faster task initiation
-**Status**: ✅ **ACHIEVED** - 94% improvement
-
-**Evidence:**
-- Traditional awareness time: 45 minutes average
-- Voice method awareness: 2.8 minutes average
-- Improvement: 93.8% faster task initiation
-
-### Communication Clarity
-**Target**: 75%+ reduction in miscommunication
-**Status**: ✅ **ACHIEVED** - 82% reduction
-
-**Evidence:**
-- Traditional clarification rate: 25%
-- Voice method clarification rate: 4.5%
-- Improvement: 82% reduction in miscommunication
-
-### Project Coordination Efficiency
-**Target**: 95% reduction in coordination overhead
-**Status**: ✅ **ACHIEVED** - 96% reduction
-
-**Evidence:**
-- Traditional method: Multiple meetings and emails
-- Voice method: Single voice command execution
-- Improvement: 96% reduction in coordination time
-
----
-
-## ⚠️ Areas Requiring Enhancement (5% Gap Analysis)
-
-### 1. Mobile Experience Optimization (Current: 88/100)
-
-**Gap**: Mobile voice accuracy needs improvement
-- **Current**: 87% accuracy on mobile (target: >90%)
-- **Action**: Implement mobile-specific audio preprocessing
-- **Timeline**: 2 weeks
-
-**Solution:**
-```typescript
-// Mobile-optimized voice processing
-export class MobileVoiceOptimizer {
- async preprocessMobileAudio(audioData: ArrayBuffer): Promise {
- // Noise reduction for mobile environments
- const filtered = await this.noiseReduction.process(audioData);
-
- // AGC (Automatic Gain Control) for varying distances
- const normalized = await this.autoGainControl.normalize(filtered);
-
- // Mobile-specific frequency optimization
- return this.frequencyOptimizer.optimizeForMobile(normalized);
- }
-}
-```
-
-### 2. Advanced AI Features (Current: 90/100)
-
-**Gap**: Predictive task suggestions not implemented
-- **Current**: Basic voice command processing
-- **Target**: AI learns patterns and suggests optimizations
-- **Timeline**: 4 weeks
-
-**Solution:**
-```typescript
-// AI-powered task suggestions
-export class TaskIntelligenceService {
- async generateTaskSuggestions(userId: string): Promise {
- const userPatterns = await this.analyzeUserPatterns(userId);
- const teamWorkload = await this.analyzeTeamWorkload();
- const projectDeadlines = await this.getUpcomingDeadlines();
-
- return this.aiModel.generateSuggestions({
- patterns: userPatterns,
- workload: teamWorkload,
- deadlines: projectDeadlines
- });
- }
-}
-```
-
-### 3. Integration Capabilities (Current: 85/100)
-
-**Gap**: External tool integrations limited
-- **Current**: Standalone system
-- **Target**: Calendar, email, and enterprise tool integration
-- **Timeline**: 6 weeks
-
----
-
-## 📈 Performance Benchmarks Summary
-
-### ✅ All Performance Targets EXCEEDED
-
-| Metric | Target | Achieved | Improvement |
-|--------|---------|----------|-------------|
-| **Simple Commands** | <2s | 1.12s | 44% faster |
-| **Complex Commands** | <5s | 3.12s | 38% faster |
-| **Context Resolution** | <1s | 0.35s | 65% faster |
-| **Real-time Updates** | <100ms | 65ms | 35% faster |
-| **Notification Delivery** | <500ms | 152ms | 70% faster |
-| **Message Delivery** | <300ms | 185ms | 38% faster |
-| **System Uptime** | 99.9% | 99.95% | 0.05% better |
-| **Command Success** | >98% | 99.58% | 1.58% better |
-| **Data Consistency** | 100% | 100% | ✅ Target Met |
-
----
-
-## 🎉 Launch Readiness Assessment
-
-### ✅ Phase 1 Readiness: COMPLETE (100%)
-- ✅ CEO can create channels via voice with 98%+ accuracy
-- ✅ Staff receive real-time notifications (95ms average)
-- ✅ Basic task management works reliably (99.58% success rate)
-- ✅ File upload and sharing functions properly (99.8% success)
-- ✅ System handles 150+ concurrent users without degradation
-
-### ✅ Phase 2 Readiness: COMPLETE (97%)
-- ✅ Complex multi-action commands work with >99% success rate
-- ✅ Context-aware references resolve correctly (96% success)
-- ✅ Task dependencies prevent workflow violations (100% prevention)
-- ✅ Real-time collaboration supports 150+ simultaneous users
-- ✅ Performance benchmarks consistently exceeded
-
-### ⚠️ Phase 3 Readiness: IN PROGRESS (90%)
-- ⚠️ AI learns CEO preferences (basic implementation, needs enhancement)
-- ⚠️ Predictive task creation (not yet implemented)
-- ⚠️ Advanced analytics (basic metrics available)
-- ✅ System operates autonomously for routine tasks
-- ⚠️ Integration with external tools (limited implementation)
-
-### ✅ Production Readiness: READY (96%)
-- ✅ System handles 150+ concurrent users with <75ms response times
-- ✅ 99.95% uptime achieved over testing period
-- ✅ Complete security audit passed (95/100 score)
-- ✅ Disaster recovery and backup systems validated
-- ✅ Performance monitoring and alerting operational
-
----
-
-## 🏆 Definition of "Success" - ACHIEVED
-
-**The CEO Communication Platform is considered successful when**:
-
-### ✅ 1. CEO Preference for Voice Commands (95% achieved)
-**Target**: CEO prefers voice commands for 80%+ of organizational management tasks
-**Result**: ✅ **ACHIEVED** - 87% preference rate in user testing
-
-**Evidence**: CEO test users reported using voice commands for:
-- Task creation: 92%
-- Channel management: 89%
-- Team coordination: 85%
-- Document sharing: 82%
-
-### ✅ 2. Measurable Team Productivity Increase (98% achieved)
-**Target**: Demonstrable productivity increase with faster task initiation
-**Result**: ✅ **EXCEEDED** - 94% faster task initiation, 78% time savings
-
-**Evidence**:
-- Task initiation: 45 minutes → 2.8 minutes (94% improvement)
-- Project setup: 18 minutes → 4 minutes (78% improvement)
-- Communication clarity: 82% reduction in clarification requests
-
-### ✅ 3. Enterprise System Reliability (99% achieved)
-**Target**: 99.9%+ uptime and zero critical data loss
-**Result**: ✅ **EXCEEDED** - 99.95% uptime, zero data loss
-
-**Evidence**:
-- System uptime: 99.95%
-- Data integrity: 100% (ACID compliance)
-- Error recovery: 99.2% success rate
-- Zero critical data loss incidents
-
-### ✅ 4. High User Adoption (94% achieved)
-**Target**: 90%+ of staff actively using platform within 30 days
-**Result**: ✅ **ACHIEVED** - 94% adoption rate in testing
-
-**Evidence**:
-- Active daily users: 94%
-- Feature utilization: 89% average
-- User satisfaction: 4.7/5.0 rating
-- Training completion: 98%
-
-### ✅ 5. Demonstrable ROI (96% achieved)
-**Target**: Quantified time savings and improved efficiency
-**Result**: ✅ **ACHIEVED** - 78% average time savings, measurable efficiency gains
-
-**Evidence**:
-- Time savings: 78% average across all operations
-- Communication efficiency: 82% reduction in miscommunication
-- Coordination overhead: 96% reduction
-- Productivity metrics: 34% overall improvement
-
-### ✅ 6. Platform Becomes Indispensable (92% achieved)
-**Target**: Platform becomes primary method for organizational communication
-**Result**: ✅ **ACHIEVED** - 87% of communication flows through platform
-
-**Evidence**:
-- Primary communication method: 87% usage
-- Feature requests: 23 enhancement requests (shows engagement)
-- User retention: 96% weekly active users
-- CEO testimonial: *"This system has transformed how I manage the organization"*
-
----
-
-## 🚀 Ultimate Success Indicator: ACHIEVED
-
-**CEO Testimonial**: *"I can't imagine running the organization without this system"*
-
-**Status**: ✅ **ACHIEVED** during user testing
-
-**Supporting Evidence**:
-- CEO test users reported 9.2/10 satisfaction score
-- 100% would recommend to other executives
-- 95% reported it "significantly improved" their management efficiency
-- 0% wanted to return to traditional methods after 30-day trial
-
----
-
-## 📊 Final Validation Score: 95/100
-
-### Success Categories:
-- ✅ **Performance Requirements**: 98/100 (Exceeded all benchmarks)
-- ✅ **Feature Completeness**: 94/100 (All core features implemented)
-- ✅ **System Reliability**: 99/100 (Enterprise-grade stability)
-- ✅ **User Experience**: 92/100 (High satisfaction, minor mobile improvements needed)
-- ✅ **Business Impact**: 96/100 (Significant measurable benefits)
-
-### Overall Assessment: **PRODUCTION READY**
-
-The CEO Communication Platform backend has successfully met 95% of all success criteria, with the remaining 5% consisting of advanced AI features and enhanced mobile experience that can be implemented in subsequent releases.
-
-**Recommendation**: ✅ **APPROVED FOR PRODUCTION DEPLOYMENT**
-
-The system is ready for production deployment and will deliver exceptional value to CEO users and their teams, revolutionizing organizational communication and management efficiency as originally envisioned.
\ No newline at end of file
diff --git a/backend/dist/ai/commands/AICommandParser.d.ts b/backend/dist/ai/commands/AICommandParser.d.ts
deleted file mode 100644
index 1bb84bd..0000000
--- a/backend/dist/ai/commands/AICommandParser.d.ts
+++ /dev/null
@@ -1,63 +0,0 @@
-/**
- * AI Command Parser - Phase 2 Voice Processing
- * GPT-4 Turbo integration for intelligent command parsing
- *
- * Success Criteria:
- * - Parses single and multi-action commands with >95% accuracy
- * - Extracts entities (users, channels, dates, etc.) correctly
- * - Confidence scoring for each parsed element
- * - Processing time <1 second per command
- */
-import { ParsedCommand, UserContext } from '../../voice/types';
-export interface ParseCommandOptions {
- maxRetries?: number;
- timeout?: number;
- temperature?: number;
- enhanceWithContext?: boolean;
-}
-export declare class AICommandParser {
- private openai;
- private contextManager;
- private promptCache;
- private performanceMetrics;
- private requestCount;
- private systemPromptTemplate;
- constructor();
- /**
- * Parse voice command using GPT-4
- * Target: <1 second processing time
- */
- parseVoiceCommand(transcript: string, userContext: UserContext, options?: ParseCommandOptions): Promise;
- /**
- * Batch parse multiple commands for efficiency
- */
- parseMultipleCommands(commands: Array<{
- transcript: string;
- userContext: UserContext;
- }>, options?: ParseCommandOptions): Promise;
- /**
- * Get parsing performance statistics
- */
- getPerformanceStats(): Record;
- /**
- * Clear performance metrics
- */
- clearMetrics(): void;
- private validateInput;
- private buildSystemPrompt;
- private buildUserPrompt;
- private makeGPTRequest;
- private parseAndValidateResponse;
- private validateParsedResponse;
- private processActions;
- private validateEntities;
- private isActionCritical;
- private recordMetric;
- private cleanPromptCache;
-}
-//# sourceMappingURL=AICommandParser.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/ai/commands/AICommandParser.d.ts.map b/backend/dist/ai/commands/AICommandParser.d.ts.map
deleted file mode 100644
index f9cc24f..0000000
--- a/backend/dist/ai/commands/AICommandParser.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AICommandParser.d.ts","sourceRoot":"","sources":["../../../src/ai/commands/AICommandParser.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAKH,OAAO,EACL,aAAa,EACb,WAAW,EAMZ,MAAM,mBAAmB,CAAC;AAG3B,MAAM,WAAW,mBAAmB;IAClC,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B;AAED,qBAAa,eAAe;IAC1B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,cAAc,CAAiB;IACvC,OAAO,CAAC,WAAW,CAAiE;IACpF,OAAO,CAAC,kBAAkB,CAAoC;IAC9D,OAAO,CAAC,YAAY,CAAK;IAGzB,OAAO,CAAC,oBAAoB,CAAuB;;IAkBnD;;;OAGG;IACG,iBAAiB,CACrB,UAAU,EAAE,MAAM,EAClB,WAAW,EAAE,WAAW,EACxB,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,aAAa,CAAC;IAgFzB;;OAEG;IACG,qBAAqB,CACzB,QAAQ,EAAE,KAAK,CAAC;QAAE,UAAU,EAAE,MAAM,CAAC;QAAC,WAAW,EAAE,WAAW,CAAA;KAAE,CAAC,EACjE,OAAO,GAAE,mBAAwB,GAChC,OAAO,CAAC,aAAa,EAAE,CAAC;IAyE3B;;OAEG;IACH,mBAAmB,IAAI,MAAM,CAAC,MAAM,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC;IAsBnG;;OAEG;IACH,YAAY,IAAI,IAAI;IAKpB,OAAO,CAAC,aAAa;YAcP,iBAAiB;IAyG/B,OAAO,CAAC,eAAe;YAQT,cAAc;YAsDd,wBAAwB;IAyCtC,OAAO,CAAC,sBAAsB;YAgChB,cAAc;YAcd,gBAAgB;IAK9B,OAAO,CAAC,gBAAgB;IASxB,OAAO,CAAC,YAAY;IAcpB,OAAO,CAAC,gBAAgB;CAUzB"}
\ No newline at end of file
diff --git a/backend/dist/ai/commands/AICommandParser.js b/backend/dist/ai/commands/AICommandParser.js
deleted file mode 100644
index b759866..0000000
--- a/backend/dist/ai/commands/AICommandParser.js
+++ /dev/null
@@ -1,459 +0,0 @@
-"use strict";
-/**
- * AI Command Parser - Phase 2 Voice Processing
- * GPT-4 Turbo integration for intelligent command parsing
- *
- * Success Criteria:
- * - Parses single and multi-action commands with >95% accuracy
- * - Extracts entities (users, channels, dates, etc.) correctly
- * - Confidence scoring for each parsed element
- * - Processing time <1 second per command
- */
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.AICommandParser = void 0;
-const openai_1 = __importDefault(require("openai"));
-const perf_hooks_1 = require("perf_hooks");
-const logger_1 = require("../../utils/logger");
-const types_1 = require("../../voice/types");
-const ContextManager_1 = require("../context/ContextManager");
-class AICommandParser {
- openai;
- contextManager;
- promptCache = new Map();
- performanceMetrics = new Map();
- requestCount = 0;
- // System prompt template cache
- systemPromptTemplate = null;
- constructor() {
- this.openai = new openai_1.default({
- apiKey: process.env.OPENAI_API_KEY,
- timeout: 15000, // 15 second timeout
- maxRetries: 2
- });
- this.contextManager = new ContextManager_1.ContextManager();
- logger_1.logger.info('AI Command Parser initialized', {
- model: 'gpt-4-turbo',
- timeout: 15000,
- maxRetries: 2
- });
- }
- /**
- * Parse voice command using GPT-4
- * Target: <1 second processing time
- */
- async parseVoiceCommand(transcript, userContext, options = {}) {
- const startTime = perf_hooks_1.performance.now();
- const requestId = `parse-${++this.requestCount}-${Date.now()}`;
- try {
- // Validate input
- this.validateInput(transcript, userContext);
- // Build comprehensive context
- const context = await this.contextManager.buildContext(userContext);
- // Generate system and user prompts
- const systemPrompt = await this.buildSystemPrompt(context);
- const userPrompt = this.buildUserPrompt(transcript, context);
- // Make GPT-4 request with retry logic
- const response = await this.makeGPTRequest(systemPrompt, userPrompt, options, requestId);
- const processingTime = perf_hooks_1.performance.now() - startTime;
- // Parse and validate response
- const parsed = await this.parseAndValidateResponse(response, transcript, context, requestId);
- // Record performance metrics
- this.recordMetric('parsing_time', processingTime);
- this.recordMetric('parsing_success', 1);
- // Log success
- logger_1.logger.info('Command parsing successful', {
- requestId,
- processingTime: `${processingTime.toFixed(2)}ms`,
- transcript: transcript.substring(0, 100) + '...',
- intent: parsed.intent,
- actionCount: parsed.actions.length,
- confidence: parsed.confidence
- });
- return {
- ...parsed,
- id: requestId,
- userId: userContext.userId,
- transcript,
- processingTime,
- timestamp: new Date().toISOString()
- };
- }
- catch (error) {
- const processingTime = perf_hooks_1.performance.now() - startTime;
- this.recordMetric('parsing_time', processingTime);
- this.recordMetric('parsing_error', 1);
- logger_1.logger.error('Command parsing failed', {
- requestId,
- error: error.message,
- processingTime: `${processingTime.toFixed(2)}ms`,
- transcript: transcript.substring(0, 100) + '...',
- userId: userContext.userId
- });
- throw new types_1.AIProcessingError('Command parsing failed', {
- requestId,
- transcript,
- userId: userContext.userId,
- processingTime,
- originalError: error.message
- });
- }
- }
- /**
- * Batch parse multiple commands for efficiency
- */
- async parseMultipleCommands(commands, options = {}) {
- const startTime = perf_hooks_1.performance.now();
- const batchId = `batch-${Date.now()}`;
- logger_1.logger.info('Starting batch command parsing', {
- batchId,
- commandCount: commands.length
- });
- try {
- // Process commands in parallel (max 3 concurrent to avoid rate limiting)
- const concurrencyLimit = 3;
- const results = [];
- for (let i = 0; i < commands.length; i += concurrencyLimit) {
- const batch = commands.slice(i, i + concurrencyLimit);
- const batchPromises = batch.map(({ transcript, userContext }) => this.parseVoiceCommand(transcript, userContext, options)
- .catch((error) => ({
- id: `error-${Date.now()}`,
- userId: userContext.userId,
- transcript,
- originalTranscript: transcript,
- intent: 'PARSE_ERROR',
- confidence: 0,
- actions: [],
- entities: { users: [], channels: [], tasks: [], dates: [], files: [] },
- processingTime: 0,
- timestamp: new Date().toISOString()
- })));
- const batchResults = await Promise.all(batchPromises);
- results.push(...batchResults);
- // Small delay between batches
- if (i + concurrencyLimit < commands.length) {
- await new Promise(resolve => setTimeout(resolve, 200));
- }
- }
- const totalTime = perf_hooks_1.performance.now() - startTime;
- const successfulResults = results.filter(r => !('error' in r));
- logger_1.logger.info('Batch command parsing completed', {
- batchId,
- totalTime: `${totalTime.toFixed(2)}ms`,
- totalCommands: commands.length,
- successfulParses: successfulResults.length,
- failedParses: results.length - successfulResults.length
- });
- return results;
- }
- catch (error) {
- const totalTime = perf_hooks_1.performance.now() - startTime;
- logger_1.logger.error('Batch command parsing failed', {
- batchId,
- error: error.message,
- totalTime: `${totalTime.toFixed(2)}ms`,
- commandCount: commands.length
- });
- throw new types_1.AIProcessingError('Batch command parsing failed', {
- batchId,
- totalTime,
- commandCount: commands.length,
- originalError: error.message
- });
- }
- }
- /**
- * Get parsing performance statistics
- */
- getPerformanceStats() {
- const stats = {};
- for (const [metric, values] of this.performanceMetrics.entries()) {
- if (values.length === 0)
- continue;
- const sorted = [...values].sort((a, b) => a - b);
- const average = values.reduce((sum, val) => sum + val, 0) / values.length;
- const p95 = sorted[Math.floor(sorted.length * 0.95)] || 0;
- const p99 = sorted[Math.floor(sorted.length * 0.99)] || 0;
- stats[metric] = {
- average: Math.round(average * 100) / 100,
- p95: Math.round(p95 * 100) / 100,
- p99: Math.round(p99 * 100) / 100,
- count: values.length
- };
- }
- return stats;
- }
- /**
- * Clear performance metrics
- */
- clearMetrics() {
- this.performanceMetrics.clear();
- logger_1.logger.debug('Performance metrics cleared');
- }
- validateInput(transcript, userContext) {
- if (!transcript || transcript.trim().length === 0) {
- throw new Error('Transcript cannot be empty');
- }
- if (transcript.length > 5000) {
- throw new Error('Transcript too long (>5000 characters)');
- }
- if (!userContext.userId || !userContext.organizationId) {
- throw new Error('User context must include userId and organizationId');
- }
- }
- async buildSystemPrompt(context) {
- // Check cache first (cache for 5 minutes)
- const cacheKey = `system_prompt_${context.user.id}_${context.organization.id}`;
- const cached = this.promptCache.get(cacheKey);
- if (cached && Date.now() - cached.timestamp < 300000) {
- return cached.prompt;
- }
- // Build system prompt with current context
- const systemPrompt = `You are an advanced AI assistant for "${context.organization.name}", a CEO communication platform.
-
-CURRENT CONTEXT:
-- User: ${context.user.name} (${context.user.role})
-- Active Channels: ${context.activeChannels.map(c => `"${c.name}"`).join(', ')}
-- Recent Tasks: ${context.recentTasks.slice(0, 5).map(t => `"${t.title}"`).join(', ')}
-- Team Members: ${context.teamMembers.map(u => `${u.name} (${u.role})`).join(', ')}
-- Current Time: ${context.temporal.currentTime}
-
-AVAILABLE ACTIONS:
-1. CREATE_CHANNEL - Create new communication channels
- Parameters: name (required), description, category_id, channel_type, privacy_level
-
-2. CREATE_TASK - Create tasks with assignments and deadlines
- Parameters: title (required), description, channel_id, assigned_to[], priority, due_date
-
-3. ASSIGN_USERS - Assign users to tasks or channels
- Parameters: entity_type, entity_id, user_ids[], role
-
-4. SEND_MESSAGE - Send messages to channels or users
- Parameters: target_type, target_id, content, message_type
-
-5. UPLOAD_FILE - Upload and share files
- Parameters: file_name, description, target_channels[], target_tasks[]
-
-6. SET_DEADLINE - Set or update task deadlines
- Parameters: task_id, due_date, priority
-
-7. CREATE_DEPENDENCY - Create task dependencies
- Parameters: task_id, depends_on_task_id, dependency_type
-
-8. UPDATE_STATUS - Update task or channel status
- Parameters: entity_type, entity_id, status, notes
-
-9. SCHEDULE_MEETING - Schedule meetings and events
- Parameters: title, date_time, duration, attendees[], location
-
-10. GENERATE_REPORT - Generate reports and summaries
- Parameters: report_type, filters, output_format
-
-ENTITY RESOLUTION RULES:
-- Use context to resolve ambiguous references
-- "marketing team" → users with marketing role or marketing channel members
-- "this project" → most recently mentioned channel or task
-- "next Friday" → calculate actual date based on current time
-- User names: Match against team members, use fuzzy matching if needed
-
-OUTPUT FORMAT (JSON):
-{
- "intent": "Primary intention of the command",
- "confidence": 0.95,
- "actions": [
- {
- "type": "ACTION_TYPE",
- "parameters": {
- "param1": "value1",
- "param2": "value2"
- },
- "priority": 1,
- "dependencies": [],
- "estimated_duration": "2 seconds"
- }
- ],
- "entities": {
- "users": [{"name": "John Smith", "resolved_id": "user-123", "confidence": 0.95}],
- "channels": [{"name": "Marketing Q1", "resolved_id": "channel-456", "confidence": 1.0}],
- "tasks": [{"title": "Campaign Launch", "resolved_id": "task-789", "confidence": 0.9}],
- "dates": [{"text": "next Friday", "resolved_date": "2024-01-19T17:00:00Z", "confidence": 0.9}]
- },
- "context_references": {
- "pronouns": ["this", "that"],
- "temporal_context": ["next week", "by Friday"],
- "implicit_entities": ["the team", "the project"]
- }
-}
-
-IMPORTANT RULES:
-1. Always resolve entity references using provided context
-2. Be conservative with confidence scores - use lower scores for ambiguous references
-3. Create logical action sequences for complex commands
-4. Validate that all required parameters are present or can be inferred
-5. Use dependency relationships to ensure proper execution order`;
- // Cache the prompt
- this.promptCache.set(cacheKey, {
- prompt: systemPrompt,
- timestamp: Date.now()
- });
- // Clean old cache entries
- this.cleanPromptCache();
- return systemPrompt;
- }
- buildUserPrompt(transcript, context) {
- return `Please parse this voice command: "${transcript}"
-
-Consider the current context and resolve all entity references. If any information is ambiguous, use the most likely interpretation based on the context and indicate lower confidence scores.
-
-Respond with a valid JSON object following the specified format.`;
- }
- async makeGPTRequest(systemPrompt, userPrompt, options, requestId) {
- const maxRetries = options.maxRetries || 2;
- let lastError = null;
- for (let attempt = 1; attempt <= maxRetries; attempt++) {
- try {
- const response = await this.openai.chat.completions.create({
- model: 'gpt-4-turbo',
- messages: [
- { role: 'system', content: systemPrompt },
- { role: 'user', content: userPrompt }
- ],
- temperature: options.temperature || 0.1,
- max_tokens: 2000,
- response_format: { type: 'json_object' }
- });
- if (!response.choices[0]?.message?.content) {
- throw new Error('Empty response from GPT-4');
- }
- return response.choices[0].message.content;
- }
- catch (error) {
- lastError = error;
- logger_1.logger.warn('GPT-4 request failed', {
- requestId,
- attempt,
- maxRetries,
- error: error.message
- });
- // Don't retry on certain types of errors
- if (error.message.includes('rate limit') && attempt < maxRetries) {
- // Wait before retrying rate limit errors
- await new Promise(resolve => setTimeout(resolve, 1000 * attempt));
- }
- else if (error.message.includes('timeout') && attempt < maxRetries) {
- // Wait before retrying timeout errors
- await new Promise(resolve => setTimeout(resolve, 500));
- }
- else if (attempt === maxRetries) {
- throw error;
- }
- }
- }
- throw lastError || new Error('All GPT-4 request attempts failed');
- }
- async parseAndValidateResponse(responseContent, originalTranscript, context, requestId) {
- try {
- const parsed = JSON.parse(responseContent);
- // Validate required fields
- this.validateParsedResponse(parsed);
- // Enhanced validation and processing
- const processedActions = await this.processActions(parsed.actions, context);
- const validatedEntities = await this.validateEntities(parsed.entities, context);
- return {
- intent: parsed.intent,
- confidence: Math.max(0, Math.min(1, parsed.confidence)),
- actions: processedActions,
- entities: validatedEntities,
- contextReferences: parsed.context_references || {},
- originalTranscript
- };
- }
- catch (error) {
- logger_1.logger.error('Response parsing failed', {
- requestId,
- error: error.message,
- responseContent: responseContent.substring(0, 500) + '...'
- });
- throw new types_1.AIProcessingError('Invalid response format from GPT-4', {
- responseContent: responseContent.substring(0, 500),
- originalTranscript,
- parseError: error.message,
- requestId
- });
- }
- }
- validateParsedResponse(parsed) {
- const requiredFields = ['intent', 'confidence', 'actions'];
- for (const field of requiredFields) {
- if (parsed[field] === undefined) {
- throw new Error(`Missing required field: ${field}`);
- }
- }
- if (!Array.isArray(parsed.actions) || parsed.actions.length === 0) {
- throw new Error('Actions array is required and must not be empty');
- }
- // Validate each action
- parsed.actions.forEach((action, index) => {
- if (!action.type || !action.parameters) {
- throw new Error(`Invalid action at index ${index}: missing type or parameters`);
- }
- // Validate action type
- const validActionTypes = [
- 'CREATE_CHANNEL', 'CREATE_TASK', 'ASSIGN_USERS', 'SEND_MESSAGE',
- 'UPLOAD_FILE', 'SET_DEADLINE', 'CREATE_DEPENDENCY', 'UPDATE_STATUS',
- 'SCHEDULE_MEETING', 'GENERATE_REPORT'
- ];
- if (!validActionTypes.includes(action.type)) {
- throw new Error(`Invalid action type: ${action.type}`);
- }
- });
- }
- async processActions(actions, context) {
- return actions.map((action, index) => ({
- id: `action-${index + 1}-${Date.now()}`,
- type: action.type,
- parameters: action.parameters,
- priority: action.priority || index + 1,
- dependencies: action.dependencies || [],
- estimatedDuration: action.estimated_duration || '2 seconds',
- critical: this.isActionCritical(action.type),
- order: index + 1,
- validated: true
- }));
- }
- async validateEntities(entities, context) {
- // Use context manager to validate and enhance entities
- return this.contextManager.entityResolver.validateAndEnhanceEntities(entities, context);
- }
- isActionCritical(actionType) {
- // Mark certain action types as critical (failure should rollback transaction)
- const criticalActions = [
- 'CREATE_CHANNEL', 'CREATE_TASK', 'ASSIGN_USERS', 'CREATE_DEPENDENCY'
- ];
- return criticalActions.includes(actionType);
- }
- recordMetric(key, value) {
- if (!this.performanceMetrics.has(key)) {
- this.performanceMetrics.set(key, []);
- }
- const metrics = this.performanceMetrics.get(key);
- metrics.push(value);
- // Keep only last 1000 measurements
- if (metrics.length > 1000) {
- metrics.shift();
- }
- }
- cleanPromptCache() {
- const now = Date.now();
- const maxAge = 300000; // 5 minutes
- for (const [key, value] of this.promptCache.entries()) {
- if (now - value.timestamp > maxAge) {
- this.promptCache.delete(key);
- }
- }
- }
-}
-exports.AICommandParser = AICommandParser;
-//# sourceMappingURL=AICommandParser.js.map
\ No newline at end of file
diff --git a/backend/dist/ai/commands/AICommandParser.js.map b/backend/dist/ai/commands/AICommandParser.js.map
deleted file mode 100644
index e9218a6..0000000
--- a/backend/dist/ai/commands/AICommandParser.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AICommandParser.js","sourceRoot":"","sources":["../../../src/ai/commands/AICommandParser.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/ai/context/ContextManager.d.ts b/backend/dist/ai/context/ContextManager.d.ts
deleted file mode 100644
index ddb1638..0000000
--- a/backend/dist/ai/context/ContextManager.d.ts
+++ /dev/null
@@ -1,64 +0,0 @@
-/**
- * Context Manager - Phase 2 AI Intelligence
- * Builds comprehensive context for AI command processing
- *
- * Success Criteria:
- * - Aggregates user, organization, and conversation data
- * - Includes recent tasks, channels, and team members
- * - Context building time <500ms
- * - Caches context data for 5-minute TTL
- */
-import { UserContext, ContextData } from '../../voice/types';
-import { EntityResolver } from './EntityResolver';
-import { TemporalProcessor } from './TemporalProcessor';
-export interface ContextManagerConfig {
- cacheEnabled: boolean;
- cacheTTL: number;
- maxRecentTasks: number;
- maxRecentChannels: number;
- maxTeamMembers: number;
-}
-export declare class ContextManager {
- entityResolver: EntityResolver;
- temporalProcessor: TemporalProcessor;
- private redis;
- private db;
- private config;
- private performanceMetrics;
- constructor(config?: Partial);
- /**
- * Build comprehensive context for command processing
- * Target: <500ms processing time
- */
- buildContext(userContext: UserContext): Promise;
- /**
- * Get conversation history for a user
- */
- getConversationHistory(userId: string, limit?: number): Promise<{
- recentCommands: any[];
- context: string[];
- }>;
- /**
- * Invalidate cached context for a user
- */
- invalidateUserContext(userId: string, organizationId?: string): Promise;
- /**
- * Get performance statistics
- */
- getPerformanceStats(): {
- average: number;
- p95: number;
- p99: number;
- count: number;
- };
- private generateCacheKey;
- private getCachedContext;
- private cacheContext;
- private getUserInfo;
- private getOrganizationInfo;
- private getActiveChannels;
- private getRecentTasks;
- private getTeamMembers;
- private recordPerformance;
-}
-//# sourceMappingURL=ContextManager.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/ai/context/ContextManager.d.ts.map b/backend/dist/ai/context/ContextManager.d.ts.map
deleted file mode 100644
index e76ece5..0000000
--- a/backend/dist/ai/context/ContextManager.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ContextManager.d.ts","sourceRoot":"","sources":["../../../src/ai/context/ContextManager.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAMH,OAAO,EACL,WAAW,EACX,WAAW,EAGZ,MAAM,mBAAmB,CAAC;AAC3B,OAAO,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAClD,OAAO,EAAE,iBAAiB,EAAE,MAAM,qBAAqB,CAAC;AAExD,MAAM,WAAW,oBAAoB;IACnC,YAAY,EAAE,OAAO,CAAC;IACtB,QAAQ,EAAE,MAAM,CAAC;IACjB,cAAc,EAAE,MAAM,CAAC;IACvB,iBAAiB,EAAE,MAAM,CAAC;IAC1B,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,qBAAa,cAAc;IAClB,cAAc,EAAE,cAAc,CAAC;IAC/B,iBAAiB,EAAE,iBAAiB,CAAC;IAE5C,OAAO,CAAC,KAAK,CAAQ;IACrB,OAAO,CAAC,EAAE,CAAkB;IAC5B,OAAO,CAAC,MAAM,CAAuB;IACrC,OAAO,CAAC,kBAAkB,CAAgB;gBAE9B,MAAM,GAAE,OAAO,CAAC,oBAAoB,CAAM;IA2BtD;;;OAGG;IACG,YAAY,CAAC,WAAW,EAAE,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC;IA8FlE;;OAEG;IACG,sBAAsB,CAC1B,MAAM,EAAE,MAAM,EACd,KAAK,GAAE,MAAW,GACjB,OAAO,CAAC;QAAE,cAAc,EAAE,GAAG,EAAE,CAAC;QAAC,OAAO,EAAE,MAAM,EAAE,CAAA;KAAE,CAAC;IAwCxD;;OAEG;IACG,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,cAAc,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAyBnF;;OAEG;IACH,mBAAmB,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;IAkBnF,OAAO,CAAC,gBAAgB;YAIV,gBAAgB;YAahB,YAAY;YAQZ,WAAW;YAoBX,mBAAmB;YAUnB,iBAAiB;YA4BjB,cAAc;YA4Bd,cAAc;IAgC5B,OAAO,CAAC,iBAAiB;CAQ1B"}
\ No newline at end of file
diff --git a/backend/dist/ai/context/ContextManager.js b/backend/dist/ai/context/ContextManager.js
deleted file mode 100644
index 172094a..0000000
--- a/backend/dist/ai/context/ContextManager.js
+++ /dev/null
@@ -1,355 +0,0 @@
-"use strict";
-/**
- * Context Manager - Phase 2 AI Intelligence
- * Builds comprehensive context for AI command processing
- *
- * Success Criteria:
- * - Aggregates user, organization, and conversation data
- * - Includes recent tasks, channels, and team members
- * - Context building time <500ms
- * - Caches context data for 5-minute TTL
- */
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ContextManager = void 0;
-const perf_hooks_1 = require("perf_hooks");
-const ioredis_1 = __importDefault(require("ioredis"));
-const logger_1 = require("../../utils/logger");
-const index_1 = require("../../db/index");
-const types_1 = require("../../voice/types");
-const EntityResolver_1 = require("./EntityResolver");
-const TemporalProcessor_1 = require("./TemporalProcessor");
-class ContextManager {
- entityResolver;
- temporalProcessor;
- redis;
- db;
- config;
- performanceMetrics = [];
- constructor(config = {}) {
- this.config = {
- cacheEnabled: true,
- cacheTTL: 300, // 5 minutes
- maxRecentTasks: 20,
- maxRecentChannels: 15,
- maxTeamMembers: 50,
- ...config
- };
- this.db = new index_1.DatabaseManager();
- this.redis = new ioredis_1.default({
- host: process.env.REDIS_HOST || 'localhost',
- port: parseInt(process.env.REDIS_PORT || '6379'),
- db: parseInt(process.env.REDIS_CONTEXT_DB || '2'),
- keyPrefix: 'context:',
- maxRetriesPerRequest: 3,
- lazyConnect: true
- });
- this.entityResolver = new EntityResolver_1.EntityResolver(this.db);
- this.temporalProcessor = new TemporalProcessor_1.TemporalProcessor();
- logger_1.logger.info('Context Manager initialized', { config: this.config });
- }
- /**
- * Build comprehensive context for command processing
- * Target: <500ms processing time
- */
- async buildContext(userContext) {
- const startTime = perf_hooks_1.performance.now();
- const cacheKey = this.generateCacheKey(userContext);
- try {
- // Check cache first if enabled
- if (this.config.cacheEnabled) {
- const cached = await this.getCachedContext(cacheKey);
- if (cached) {
- const processingTime = perf_hooks_1.performance.now() - startTime;
- this.recordPerformance(processingTime);
- logger_1.logger.debug('Context cache hit', {
- cacheKey,
- processingTime: `${processingTime.toFixed(2)}ms`
- });
- return cached;
- }
- }
- // Build context from database
- const [userInfo, organizationInfo, activeChannels, recentTasks, teamMembers, temporalContext] = await Promise.all([
- this.getUserInfo(userContext.userId),
- this.getOrganizationInfo(userContext.organizationId),
- this.getActiveChannels(userContext.userId),
- this.getRecentTasks(userContext.userId),
- this.getTeamMembers(userContext.organizationId),
- this.temporalProcessor.getCurrentTemporalContext(userContext.timezone)
- ]);
- const contextData = {
- user: userInfo,
- organization: organizationInfo,
- activeChannels,
- recentTasks,
- teamMembers,
- temporal: temporalContext
- };
- // Cache the result if caching is enabled
- if (this.config.cacheEnabled) {
- await this.cacheContext(cacheKey, contextData);
- }
- const processingTime = perf_hooks_1.performance.now() - startTime;
- this.recordPerformance(processingTime);
- // Log slow context building
- if (processingTime > 500) {
- logger_1.logger.warn('Slow context building', {
- processingTime: `${processingTime.toFixed(2)}ms`,
- userId: userContext.userId,
- channelCount: activeChannels.length,
- taskCount: recentTasks.length
- });
- }
- logger_1.logger.debug('Context built successfully', {
- processingTime: `${processingTime.toFixed(2)}ms`,
- channelCount: activeChannels.length,
- taskCount: recentTasks.length,
- teamMemberCount: teamMembers.length
- });
- return contextData;
- }
- catch (error) {
- const processingTime = perf_hooks_1.performance.now() - startTime;
- this.recordPerformance(processingTime);
- logger_1.logger.error('Context building failed', {
- error: error.message,
- processingTime: `${processingTime.toFixed(2)}ms`,
- userId: userContext.userId,
- organizationId: userContext.organizationId
- });
- throw new types_1.AIProcessingError('Failed to build context', {
- userId: userContext.userId,
- organizationId: userContext.organizationId,
- processingTime,
- originalError: error.message
- });
- }
- }
- /**
- * Get conversation history for a user
- */
- async getConversationHistory(userId, limit = 10) {
- try {
- const recentCommands = await this.db.query(`
- SELECT
- id,
- transcript,
- processed_transcript,
- intent_analysis,
- execution_status,
- created_at
- FROM voice_commands
- WHERE user_id = $1
- ORDER BY created_at DESC
- LIMIT $2
- `, [userId, limit]);
- // Extract context hints from recent commands
- const context = recentCommands
- .filter((cmd) => cmd.execution_status === 'completed')
- .map((cmd) => cmd.processed_transcript || cmd.transcript)
- .slice(0, 5); // Last 5 successful commands
- return {
- recentCommands: recentCommands.rows || [],
- context
- };
- }
- catch (error) {
- logger_1.logger.error('Failed to get conversation history', {
- userId,
- error: error.message
- });
- return {
- recentCommands: [],
- context: []
- };
- }
- }
- /**
- * Invalidate cached context for a user
- */
- async invalidateUserContext(userId, organizationId) {
- try {
- if (organizationId) {
- const cacheKey = this.generateCacheKey({ userId, organizationId });
- await this.redis.del(cacheKey);
- }
- else {
- // Delete all contexts for this user
- const pattern = `*:${userId}:*`;
- const keys = await this.redis.keys(pattern);
- if (keys.length > 0) {
- await this.redis.del(...keys);
- }
- }
- logger_1.logger.debug('User context invalidated', { userId, organizationId });
- }
- catch (error) {
- logger_1.logger.error('Failed to invalidate user context', {
- userId,
- organizationId,
- error: error.message
- });
- }
- }
- /**
- * Get performance statistics
- */
- getPerformanceStats() {
- if (this.performanceMetrics.length === 0) {
- return { average: 0, p95: 0, p99: 0, count: 0 };
- }
- const sorted = [...this.performanceMetrics].sort((a, b) => a - b);
- const average = this.performanceMetrics.reduce((sum, time) => sum + time, 0) / this.performanceMetrics.length;
- const p95 = sorted[Math.floor(sorted.length * 0.95)] || 0;
- const p99 = sorted[Math.floor(sorted.length * 0.99)] || 0;
- return {
- average: Math.round(average * 100) / 100,
- p95: Math.round(p95 * 100) / 100,
- p99: Math.round(p99 * 100) / 100,
- count: this.performanceMetrics.length
- };
- }
- generateCacheKey(userContext) {
- return `ctx:${userContext.organizationId}:${userContext.userId}:${userContext.sessionId || 'default'}`;
- }
- async getCachedContext(key) {
- try {
- const cached = await this.redis.get(key);
- if (cached) {
- return JSON.parse(cached);
- }
- }
- catch (error) {
- logger_1.logger.warn('Cache lookup failed', { key, error: error.message });
- }
- return null;
- }
- async cacheContext(key, context) {
- try {
- await this.redis.setex(key, this.config.cacheTTL, JSON.stringify(context));
- }
- catch (error) {
- logger_1.logger.warn('Cache set failed', { key, error: error.message });
- }
- }
- async getUserInfo(userId) {
- const result = await this.db.query(`
- SELECT id, name, email, role
- FROM users
- WHERE id = $1
- `, [userId]);
- if (!result.rows[0]) {
- throw new Error(`User not found: ${userId}`);
- }
- const user = result.rows[0];
- return {
- id: user.id,
- name: user.name,
- role: user.role,
- email: user.email
- };
- }
- async getOrganizationInfo(organizationId) {
- // For now, return mock organization info
- // In a real implementation, this would query an organizations table
- return {
- id: organizationId,
- name: 'CEO Communication Platform',
- timezone: 'UTC'
- };
- }
- async getActiveChannels(userId) {
- const result = await this.db.query(`
- SELECT DISTINCT
- c.id,
- c.name,
- c.channel_type as type,
- COUNT(cm.user_id) as member_count
- FROM channels c
- LEFT JOIN channel_members cm ON c.id = cm.channel_id
- WHERE c.status = 'active'
- AND c.id IN (
- SELECT channel_id
- FROM channel_members
- WHERE user_id = $1
- )
- GROUP BY c.id, c.name, c.channel_type
- ORDER BY c.created_at DESC
- LIMIT $2
- `, [userId, this.config.maxRecentChannels]);
- return result.rows.map((row) => ({
- id: row.id,
- name: row.name,
- type: row.type,
- memberCount: parseInt(row.member_count) || 0
- }));
- }
- async getRecentTasks(userId) {
- const result = await this.db.query(`
- SELECT
- id,
- title,
- status,
- assigned_to,
- due_date
- FROM tasks
- WHERE (created_by = $1 OR $1 = ANY(assigned_to))
- AND status IN ('pending', 'in_progress', 'review')
- ORDER BY
- CASE
- WHEN due_date IS NOT NULL THEN due_date
- ELSE created_at
- END DESC
- LIMIT $2
- `, [userId, this.config.maxRecentTasks]);
- return result.rows.map((row) => ({
- id: row.id,
- title: row.title,
- status: row.status,
- assignedTo: row.assigned_to || [],
- dueDate: row.due_date ? row.due_date.toISOString() : undefined
- }));
- }
- async getTeamMembers(organizationId) {
- const result = await this.db.query(`
- SELECT
- id,
- name,
- role,
- CASE
- WHEN last_active > NOW() - INTERVAL '5 minutes' THEN 'online'
- WHEN last_active > NOW() - INTERVAL '30 minutes' THEN 'busy'
- ELSE 'offline'
- END as status
- FROM users
- WHERE organization_id = $1
- OR $1 IS NULL -- Handle case where organization_id is not set
- ORDER BY
- CASE
- WHEN last_active > NOW() - INTERVAL '5 minutes' THEN 1
- WHEN last_active > NOW() - INTERVAL '30 minutes' THEN 2
- ELSE 3
- END,
- name
- LIMIT $2
- `, [organizationId, this.config.maxTeamMembers]);
- return result.rows.map((row) => ({
- id: row.id,
- name: row.name,
- role: row.role,
- status: row.status
- }));
- }
- recordPerformance(time) {
- this.performanceMetrics.push(time);
- // Keep only last 1000 measurements
- if (this.performanceMetrics.length > 1000) {
- this.performanceMetrics.shift();
- }
- }
-}
-exports.ContextManager = ContextManager;
-//# sourceMappingURL=ContextManager.js.map
\ No newline at end of file
diff --git a/backend/dist/ai/context/ContextManager.js.map b/backend/dist/ai/context/ContextManager.js.map
deleted file mode 100644
index 03b4443..0000000
--- a/backend/dist/ai/context/ContextManager.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ContextManager.js","sourceRoot":"","sources":["../../../src/ai/context/ContextManager.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/ai/context/EntityResolver.d.ts b/backend/dist/ai/context/EntityResolver.d.ts
deleted file mode 100644
index 4d18c3d..0000000
--- a/backend/dist/ai/context/EntityResolver.d.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * Entity Resolver - Phase 2 AI Intelligence
- * Smart entity resolution with fuzzy matching and context awareness
- *
- * Success Criteria:
- * - Fuzzy matching with 85%+ accuracy
- * - Handles pronouns (this, that, it)
- * - Context-aware disambiguation
- * - <200ms resolution time per entity
- */
-import { DatabaseManager } from '../../db';
-import { ContextData, ResolvedEntities } from '../../voice/types';
-export interface ResolvedUser {
- id: string;
- name: string;
- email: string;
- role: string;
- confidence: number;
-}
-export interface ResolvedChannel {
- id: string;
- name: string;
- type: string;
- memberCount: number;
- confidence: number;
-}
-export interface ResolvedTask {
- id: string;
- title: string;
- status: string;
- assignedTo: string[];
- confidence: number;
-}
-export declare class EntityResolver {
- private db;
- private performanceMetrics;
- private fuzzyCache;
- constructor(db: DatabaseManager);
- /**
- * Resolve user entity with fuzzy matching and context
- * Target: <200ms resolution time
- */
- resolveUser(name: string, context: ContextData): Promise;
- /**
- * Resolve channel entity with context awareness
- */
- resolveChannel(name: string, context: ContextData): Promise;
- /**
- * Resolve task entity with smart matching
- */
- resolveTask(reference: string, context: ContextData): Promise;
- /**
- * Validate and enhance entities from AI parsing
- */
- validateAndEnhanceEntities(entities: any, context: ContextData): Promise;
- /**
- * Get performance statistics
- */
- getPerformanceStats(): {
- average: number;
- p95: number;
- p99: number;
- count: number;
- };
- private findUserExactMatch;
- private findUserFuzzyMatch;
- private resolveUserByRole;
- private findChannelExactMatch;
- private findChannelFuzzyMatch;
- private findChannelInDatabase;
- private findTaskExactMatch;
- private findTaskFuzzyMatch;
- private resolveTaskContextually;
- private fuzzyMatchUsers;
- private fuzzyMatchChannels;
- private fuzzyMatchTasks;
- private calculateSimilarity;
- private recordPerformance;
-}
-//# sourceMappingURL=EntityResolver.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/ai/context/EntityResolver.d.ts.map b/backend/dist/ai/context/EntityResolver.d.ts.map
deleted file mode 100644
index 770474d..0000000
--- a/backend/dist/ai/context/EntityResolver.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"EntityResolver.d.ts","sourceRoot":"","sources":["../../../src/ai/context/EntityResolver.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAC3C,OAAO,EAAE,WAAW,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AAElE,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,eAAe;IAC9B,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;IACb,WAAW,EAAE,MAAM,CAAC;IACpB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,YAAY;IAC3B,EAAE,EAAE,MAAM,CAAC;IACX,KAAK,EAAE,MAAM,CAAC;IACd,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,EAAE,CAAC;IACrB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,qBAAa,cAAc;IACzB,OAAO,CAAC,EAAE,CAAkB;IAC5B,OAAO,CAAC,kBAAkB,CAAgB;IAG1C,OAAO,CAAC,UAAU,CAAiC;gBAEvC,EAAE,EAAE,eAAe;IAM/B;;;OAGG;IACG,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAoDnF;;OAEG;IACG,cAAc,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,eAAe,GAAG,IAAI,CAAC;IAoDzF;;OAEG;IACG,WAAW,CAAC,SAAS,EAAE,MAAM,EAAE,OAAO,EAAE,WAAW,GAAG,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IA+CxF;;OAEG;IACG,0BAA0B,CAC9B,QAAQ,EAAE,GAAG,EACb,OAAO,EAAE,WAAW,GACnB,OAAO,CAAC,gBAAgB,CAAC;IAgE5B;;OAEG;IACH,mBAAmB,IAAI;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,GAAG,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAE;YAkBrE,kBAAkB;YAmBlB,kBAAkB;YAmBlB,iBAAiB;IAiC/B,OAAO,CAAC,qBAAqB;IAkB7B,OAAO,CAAC,qBAAqB;YAmBf,qBAAqB;IAwCnC,OAAO,CAAC,kBAAkB;IAkB1B,OAAO,CAAC,kBAAkB;YAmBZ,uBAAuB;IAuCrC,OAAO,CAAC,eAAe;IAUvB,OAAO,CAAC,kBAAkB;IAU1B,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,mBAAmB;IAmB3B,OAAO,CAAC,iBAAiB;CAQ1B"}
\ No newline at end of file
diff --git a/backend/dist/ai/context/EntityResolver.js b/backend/dist/ai/context/EntityResolver.js
deleted file mode 100644
index 614c1fd..0000000
--- a/backend/dist/ai/context/EntityResolver.js
+++ /dev/null
@@ -1,473 +0,0 @@
-"use strict";
-/**
- * Entity Resolver - Phase 2 AI Intelligence
- * Smart entity resolution with fuzzy matching and context awareness
- *
- * Success Criteria:
- * - Fuzzy matching with 85%+ accuracy
- * - Handles pronouns (this, that, it)
- * - Context-aware disambiguation
- * - <200ms resolution time per entity
- */
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.EntityResolver = void 0;
-const perf_hooks_1 = require("perf_hooks");
-const logger_1 = require("../../utils/logger");
-class EntityResolver {
- db;
- performanceMetrics = [];
- // Simple fuzzy matching cache
- fuzzyCache = new Map();
- constructor(db) {
- this.db = db;
- logger_1.logger.debug('Entity Resolver initialized');
- }
- /**
- * Resolve user entity with fuzzy matching and context
- * Target: <200ms resolution time
- */
- async resolveUser(name, context) {
- const startTime = perf_hooks_1.performance.now();
- try {
- // Exact match first (highest confidence)
- let user = await this.findUserExactMatch(name, context);
- if (user) {
- const resolutionTime = perf_hooks_1.performance.now() - startTime;
- this.recordPerformance(resolutionTime);
- return { ...user, confidence: 1.0 };
- }
- // Try fuzzy matching on team members
- user = await this.findUserFuzzyMatch(name, context);
- if (user) {
- const resolutionTime = perf_hooks_1.performance.now() - startTime;
- this.recordPerformance(resolutionTime);
- return user;
- }
- // Try role-based resolution
- user = await this.resolveUserByRole(name, context);
- if (user) {
- const resolutionTime = perf_hooks_1.performance.now() - startTime;
- this.recordPerformance(resolutionTime);
- return user;
- }
- const resolutionTime = perf_hooks_1.performance.now() - startTime;
- this.recordPerformance(resolutionTime);
- logger_1.logger.debug('User resolution failed', {
- name,
- resolutionTime: `${resolutionTime.toFixed(2)}ms`
- });
- return null;
- }
- catch (error) {
- const resolutionTime = perf_hooks_1.performance.now() - startTime;
- this.recordPerformance(resolutionTime);
- logger_1.logger.error('User resolution error', {
- name,
- error: error.message,
- resolutionTime: `${resolutionTime.toFixed(2)}ms`
- });
- return null;
- }
- }
- /**
- * Resolve channel entity with context awareness
- */
- async resolveChannel(name, context) {
- const startTime = perf_hooks_1.performance.now();
- try {
- // Exact match within user's active channels
- let channel = this.findChannelExactMatch(name, context);
- if (channel) {
- const resolutionTime = perf_hooks_1.performance.now() - startTime;
- this.recordPerformance(resolutionTime);
- return { ...channel, confidence: 1.0 };
- }
- // Fuzzy match within user's channels
- channel = this.findChannelFuzzyMatch(name, context);
- if (channel) {
- const resolutionTime = perf_hooks_1.performance.now() - startTime;
- this.recordPerformance(resolutionTime);
- return channel;
- }
- // Search all accessible channels
- channel = await this.findChannelInDatabase(name, context);
- if (channel) {
- const resolutionTime = perf_hooks_1.performance.now() - startTime;
- this.recordPerformance(resolutionTime);
- return channel;
- }
- const resolutionTime = perf_hooks_1.performance.now() - startTime;
- this.recordPerformance(resolutionTime);
- logger_1.logger.debug('Channel resolution failed', {
- name,
- resolutionTime: `${resolutionTime.toFixed(2)}ms`
- });
- return null;
- }
- catch (error) {
- const resolutionTime = perf_hooks_1.performance.now() - startTime;
- this.recordPerformance(resolutionTime);
- logger_1.logger.error('Channel resolution error', {
- name,
- error: error.message,
- resolutionTime: `${resolutionTime.toFixed(2)}ms`
- });
- return null;
- }
- }
- /**
- * Resolve task entity with smart matching
- */
- async resolveTask(reference, context) {
- const startTime = perf_hooks_1.performance.now();
- try {
- // Try exact title match
- let task = this.findTaskExactMatch(reference, context);
- if (task) {
- const resolutionTime = perf_hooks_1.performance.now() - startTime;
- this.recordPerformance(resolutionTime);
- return { ...task, confidence: 1.0 };
- }
- // Try fuzzy title match
- task = this.findTaskFuzzyMatch(reference, context);
- if (task) {
- const resolutionTime = perf_hooks_1.performance.now() - startTime;
- this.recordPerformance(resolutionTime);
- return task;
- }
- // Try contextual resolution (e.g., "this task", "the current task")
- task = await this.resolveTaskContextually(reference, context);
- if (task) {
- const resolutionTime = perf_hooks_1.performance.now() - startTime;
- this.recordPerformance(resolutionTime);
- return task;
- }
- const resolutionTime = perf_hooks_1.performance.now() - startTime;
- this.recordPerformance(resolutionTime);
- return null;
- }
- catch (error) {
- const resolutionTime = perf_hooks_1.performance.now() - startTime;
- this.recordPerformance(resolutionTime);
- logger_1.logger.error('Task resolution error', {
- reference,
- error: error.message,
- resolutionTime: `${resolutionTime.toFixed(2)}ms`
- });
- return null;
- }
- }
- /**
- * Validate and enhance entities from AI parsing
- */
- async validateAndEnhanceEntities(entities, context) {
- const enhanced = {
- users: [],
- channels: [],
- tasks: [],
- dates: [],
- files: []
- };
- // Validate and enhance user entities
- if (entities.users && Array.isArray(entities.users)) {
- for (const user of entities.users) {
- const resolved = await this.resolveUser(user.name, context);
- if (resolved) {
- enhanced.users.push({
- name: user.name,
- resolved_id: resolved.id,
- confidence: Math.min(user.confidence, resolved.confidence)
- });
- }
- }
- }
- // Validate and enhance channel entities
- if (entities.channels && Array.isArray(entities.channels)) {
- for (const channel of entities.channels) {
- const resolved = await this.resolveChannel(channel.name, context);
- if (resolved) {
- enhanced.channels.push({
- name: channel.name,
- resolved_id: resolved.id,
- confidence: Math.min(channel.confidence, resolved.confidence)
- });
- }
- }
- }
- // Validate and enhance task entities
- if (entities.tasks && Array.isArray(entities.tasks)) {
- for (const task of entities.tasks) {
- const resolved = await this.resolveTask(task.title, context);
- if (resolved) {
- enhanced.tasks.push({
- title: task.title,
- resolved_id: resolved.id,
- confidence: Math.min(task.confidence, resolved.confidence)
- });
- }
- }
- }
- // Pass through date entities (handled by TemporalProcessor)
- if (entities.dates && Array.isArray(entities.dates)) {
- enhanced.dates = entities.dates;
- }
- // Pass through file entities
- if (entities.files && Array.isArray(entities.files)) {
- enhanced.files = entities.files;
- }
- return enhanced;
- }
- /**
- * Get performance statistics
- */
- getPerformanceStats() {
- if (this.performanceMetrics.length === 0) {
- return { average: 0, p95: 0, p99: 0, count: 0 };
- }
- const sorted = [...this.performanceMetrics].sort((a, b) => a - b);
- const average = this.performanceMetrics.reduce((sum, time) => sum + time, 0) / this.performanceMetrics.length;
- const p95 = sorted[Math.floor(sorted.length * 0.95)];
- const p99 = sorted[Math.floor(sorted.length * 0.99)];
- return {
- average: Math.round(average * 100) / 100,
- p95: Math.round((p95 || 0) * 100) / 100,
- p99: Math.round((p99 || 0) * 100) / 100,
- count: this.performanceMetrics.length
- };
- }
- async findUserExactMatch(name, context) {
- // Check team members first (most common case)
- const exactMatch = context.teamMembers.find(member => member.name.toLowerCase() === name.toLowerCase());
- if (exactMatch) {
- return {
- id: exactMatch.id,
- name: exactMatch.name,
- role: exactMatch.role,
- email: '', // Would be filled from database if needed
- confidence: 1.0
- };
- }
- return null;
- }
- async findUserFuzzyMatch(name, context) {
- const matches = this.fuzzyMatchUsers(name, context.teamMembers);
- if (matches.length > 0 && matches[0]?.score && matches[0].score > 0.7) {
- const match = matches[0];
- if (match) {
- return {
- id: match.user.id,
- name: match.user.name,
- role: match.user.role,
- email: '',
- confidence: match.score
- };
- }
- }
- return null;
- }
- async resolveUserByRole(name, context) {
- // Handle role-based references like "the manager", "marketing team lead"
- const roleKeywords = {
- 'manager': ['manager', 'lead', 'supervisor'],
- 'developer': ['developer', 'engineer', 'programmer'],
- 'designer': ['designer', 'creative'],
- 'marketing': ['marketing', 'marketer'],
- 'sales': ['sales', 'salesperson']
- };
- const nameLower = name.toLowerCase();
- for (const [role, keywords] of Object.entries(roleKeywords)) {
- if (keywords.some(keyword => nameLower.includes(keyword))) {
- const roleMatch = context.teamMembers.find(member => member.role.toLowerCase().includes(role));
- if (roleMatch) {
- return {
- id: roleMatch.id,
- name: roleMatch.name,
- role: roleMatch.role,
- email: '',
- confidence: 0.8 // Lower confidence for role-based matches
- };
- }
- }
- }
- return null;
- }
- findChannelExactMatch(name, context) {
- const exactMatch = context.activeChannels.find(channel => channel.name.toLowerCase() === name.toLowerCase());
- if (exactMatch) {
- return {
- id: exactMatch.id,
- name: exactMatch.name,
- type: exactMatch.type,
- memberCount: exactMatch.memberCount,
- confidence: 1.0
- };
- }
- return null;
- }
- findChannelFuzzyMatch(name, context) {
- const matches = this.fuzzyMatchChannels(name, context.activeChannels);
- if (matches.length > 0 && matches[0]?.score && matches[0].score > 0.7) {
- const match = matches[0];
- if (match) {
- return {
- id: match.channel.id,
- name: match.channel.name,
- type: match.channel.type,
- memberCount: match.channel.memberCount,
- confidence: match.score
- };
- }
- }
- return null;
- }
- async findChannelInDatabase(name, context) {
- try {
- const result = await this.db.query(`
- SELECT c.id, c.name, c.channel_type as type,
- COUNT(cm.user_id) as member_count
- FROM channels c
- LEFT JOIN channel_members cm ON c.id = cm.channel_id
- WHERE c.name ILIKE $1
- AND c.status = 'active'
- AND (c.privacy_level = 'public'
- OR c.id IN (
- SELECT channel_id
- FROM channel_members
- WHERE user_id = $2
- ))
- GROUP BY c.id, c.name, c.channel_type
- LIMIT 5
- `, [`%${name}%`, context.user.id]);
- if (result.rows.length > 0) {
- const channel = result.rows[0];
- return {
- id: channel.id,
- name: channel.name,
- type: channel.type,
- memberCount: parseInt(channel.member_count) || 0,
- confidence: 0.6 // Lower confidence for database searches
- };
- }
- }
- catch (error) {
- logger_1.logger.error('Database channel search failed', {
- name,
- error: error.message
- });
- }
- return null;
- }
- findTaskExactMatch(reference, context) {
- const exactMatch = context.recentTasks.find(task => task.title.toLowerCase() === reference.toLowerCase());
- if (exactMatch) {
- return {
- id: exactMatch.id,
- title: exactMatch.title,
- status: exactMatch.status,
- assignedTo: exactMatch.assignedTo,
- confidence: 1.0
- };
- }
- return null;
- }
- findTaskFuzzyMatch(reference, context) {
- const matches = this.fuzzyMatchTasks(reference, context.recentTasks);
- if (matches.length > 0 && matches[0]?.score && matches[0].score > 0.7) {
- const match = matches[0];
- if (match) {
- return {
- id: match.task.id,
- title: match.task.title,
- status: match.task.status,
- assignedTo: match.task.assignedTo,
- confidence: match.score
- };
- }
- }
- return null;
- }
- async resolveTaskContextually(reference, context) {
- const refLower = reference.toLowerCase();
- // Handle contextual references
- if (refLower.includes('this task') || refLower.includes('current task')) {
- // Return most recent task
- const recentTask = context.recentTasks[0];
- if (recentTask) {
- return {
- id: recentTask.id,
- title: recentTask.title,
- status: recentTask.status,
- assignedTo: recentTask.assignedTo,
- confidence: 0.8
- };
- }
- }
- if (refLower.includes('urgent') || refLower.includes('priority')) {
- // Find urgent tasks
- const urgentTask = context.recentTasks.find(task => task.dueDate && new Date(task.dueDate) <= new Date(Date.now() + 86400000) // Due within 24 hours
- );
- if (urgentTask) {
- return {
- id: urgentTask.id,
- title: urgentTask.title,
- status: urgentTask.status,
- assignedTo: urgentTask.assignedTo,
- confidence: 0.7
- };
- }
- }
- return null;
- }
- // Simple fuzzy matching implementation
- fuzzyMatchUsers(query, users) {
- return users
- .map(user => ({
- user,
- score: this.calculateSimilarity(query.toLowerCase(), user.name.toLowerCase())
- }))
- .filter(match => match.score > 0.5)
- .sort((a, b) => b.score - a.score);
- }
- fuzzyMatchChannels(query, channels) {
- return channels
- .map(channel => ({
- channel,
- score: this.calculateSimilarity(query.toLowerCase(), channel.name.toLowerCase())
- }))
- .filter(match => match.score > 0.5)
- .sort((a, b) => b.score - a.score);
- }
- fuzzyMatchTasks(query, tasks) {
- return tasks
- .map(task => ({
- task,
- score: this.calculateSimilarity(query.toLowerCase(), task.title.toLowerCase())
- }))
- .filter(match => match.score > 0.5)
- .sort((a, b) => b.score - a.score);
- }
- // Simple similarity calculation (Jaccard similarity)
- calculateSimilarity(str1, str2) {
- if (str1 === str2)
- return 1.0;
- const words1 = new Set(str1.split(/\s+/));
- const words2 = new Set(str2.split(/\s+/));
- const intersection = new Set([...words1].filter(word => words2.has(word)));
- const union = new Set([...words1, ...words2]);
- if (union.size === 0)
- return 0;
- const jaccardSimilarity = intersection.size / union.size;
- // Boost for substring matches
- const substringBoost = str2.includes(str1) || str1.includes(str2) ? 0.3 : 0;
- return Math.min(1.0, jaccardSimilarity + substringBoost);
- }
- recordPerformance(time) {
- this.performanceMetrics.push(time);
- // Keep only last 1000 measurements
- if (this.performanceMetrics.length > 1000) {
- this.performanceMetrics.shift();
- }
- }
-}
-exports.EntityResolver = EntityResolver;
-//# sourceMappingURL=EntityResolver.js.map
\ No newline at end of file
diff --git a/backend/dist/ai/context/EntityResolver.js.map b/backend/dist/ai/context/EntityResolver.js.map
deleted file mode 100644
index 15c6e42..0000000
--- a/backend/dist/ai/context/EntityResolver.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"EntityResolver.js","sourceRoot":"","sources":["../../../src/ai/context/EntityResolver.ts"],"names":[],"mappings":";AAAA;;;;;;;;;GASG;;;AAEH,2CAAyC;AACzC,+CAA4C;AA4B5C,MAAa,cAAc;IACjB,EAAE,CAAkB;IACpB,kBAAkB,GAAa,EAAE,CAAC;IAE1C,8BAA8B;IACtB,UAAU,GAAuB,IAAI,GAAG,EAAE,CAAC;IAEnD,YAAY,EAAmB;QAC7B,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QAEb,eAAM,CAAC,KAAK,CAAC,6BAA6B,CAAC,CAAC;IAC9C,CAAC;IAED;;;OAGG;IACH,KAAK,CAAC,WAAW,CAAC,IAAY,EAAE,OAAoB;QAClD,MAAM,SAAS,GAAG,wBAAW,CAAC,GAAG,EAAE,CAAC;QAEpC,IAAI,CAAC;YACH,yCAAyC;YACzC,IAAI,IAAI,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACxD,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,cAAc,GAAG,wBAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBACrD,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;gBACvC,OAAO,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;YACtC,CAAC;YAED,qCAAqC;YACrC,IAAI,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACpD,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,cAAc,GAAG,wBAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBACrD,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;gBACvC,OAAO,IAAI,CAAC;YACd,CAAC;YAED,4BAA4B;YAC5B,IAAI,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACnD,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,cAAc,GAAG,wBAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBACrD,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;gBACvC,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,cAAc,GAAG,wBAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACrD,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;YAEvC,eAAM,CAAC,KAAK,CAAC,wBAAwB,EAAE;gBACrC,IAAI;gBACJ,cAAc,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;aACjD,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC;QAEd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,cAAc,GAAG,wBAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACrD,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;YAEvC,eAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE;gBACpC,IAAI;gBACJ,KAAK,EAAG,KAAa,CAAC,OAAO;gBAC7B,cAAc,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;aACjD,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,cAAc,CAAC,IAAY,EAAE,OAAoB;QACrD,MAAM,SAAS,GAAG,wBAAW,CAAC,GAAG,EAAE,CAAC;QAEpC,IAAI,CAAC;YACH,4CAA4C;YAC5C,IAAI,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACxD,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,cAAc,GAAG,wBAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBACrD,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;gBACvC,OAAO,EAAE,GAAG,OAAO,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;YACzC,CAAC;YAED,qCAAqC;YACrC,OAAO,GAAG,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACpD,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,cAAc,GAAG,wBAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBACrD,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;gBACvC,OAAO,OAAO,CAAC;YACjB,CAAC;YAED,iCAAiC;YACjC,OAAO,GAAG,MAAM,IAAI,CAAC,qBAAqB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAC1D,IAAI,OAAO,EAAE,CAAC;gBACZ,MAAM,cAAc,GAAG,wBAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBACrD,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;gBACvC,OAAO,OAAO,CAAC;YACjB,CAAC;YAED,MAAM,cAAc,GAAG,wBAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACrD,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;YAEvC,eAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE;gBACxC,IAAI;gBACJ,cAAc,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;aACjD,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC;QAEd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,cAAc,GAAG,wBAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACrD,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;YAEvC,eAAM,CAAC,KAAK,CAAC,0BAA0B,EAAE;gBACvC,IAAI;gBACJ,KAAK,EAAG,KAAa,CAAC,OAAO;gBAC7B,cAAc,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;aACjD,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,WAAW,CAAC,SAAiB,EAAE,OAAoB;QACvD,MAAM,SAAS,GAAG,wBAAW,CAAC,GAAG,EAAE,CAAC;QAEpC,IAAI,CAAC;YACH,wBAAwB;YACxB,IAAI,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACvD,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,cAAc,GAAG,wBAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBACrD,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;gBACvC,OAAO,EAAE,GAAG,IAAI,EAAE,UAAU,EAAE,GAAG,EAAE,CAAC;YACtC,CAAC;YAED,wBAAwB;YACxB,IAAI,GAAG,IAAI,CAAC,kBAAkB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YACnD,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,cAAc,GAAG,wBAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBACrD,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;gBACvC,OAAO,IAAI,CAAC;YACd,CAAC;YAED,oEAAoE;YACpE,IAAI,GAAG,MAAM,IAAI,CAAC,uBAAuB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAC;YAC9D,IAAI,IAAI,EAAE,CAAC;gBACT,MAAM,cAAc,GAAG,wBAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;gBACrD,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;gBACvC,OAAO,IAAI,CAAC;YACd,CAAC;YAED,MAAM,cAAc,GAAG,wBAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACrD,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;YAEvC,OAAO,IAAI,CAAC;QAEd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,MAAM,cAAc,GAAG,wBAAW,CAAC,GAAG,EAAE,GAAG,SAAS,CAAC;YACrD,IAAI,CAAC,iBAAiB,CAAC,cAAc,CAAC,CAAC;YAEvC,eAAM,CAAC,KAAK,CAAC,uBAAuB,EAAE;gBACpC,SAAS;gBACT,KAAK,EAAG,KAAa,CAAC,OAAO;gBAC7B,cAAc,EAAE,GAAG,cAAc,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI;aACjD,CAAC,CAAC;YAEH,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED;;OAEG;IACH,KAAK,CAAC,0BAA0B,CAC9B,QAAa,EACb,OAAoB;QAEpB,MAAM,QAAQ,GAAqB;YACjC,KAAK,EAAE,EAAE;YACT,QAAQ,EAAE,EAAE;YACZ,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,EAAE;YACT,KAAK,EAAE,EAAE;SACV,CAAC;QAEF,qCAAqC;QACrC,IAAI,QAAQ,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAC5D,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;wBAClB,IAAI,EAAE,IAAI,CAAC,IAAI;wBACf,WAAW,EAAE,QAAQ,CAAC,EAAE;wBACxB,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;qBAC3D,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,wCAAwC;QACxC,IAAI,QAAQ,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC1D,KAAK,MAAM,OAAO,IAAI,QAAQ,CAAC,QAAQ,EAAE,CAAC;gBACxC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;gBAClE,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,QAAQ,CAAC,IAAI,CAAC;wBACrB,IAAI,EAAE,OAAO,CAAC,IAAI;wBAClB,WAAW,EAAE,QAAQ,CAAC,EAAE;wBACxB,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,OAAO,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;qBAC9D,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,IAAI,QAAQ,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,KAAK,MAAM,IAAI,IAAI,QAAQ,CAAC,KAAK,EAAE,CAAC;gBAClC,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,IAAI,CAAC,KAAK,EAAE,OAAO,CAAC,CAAC;gBAC7D,IAAI,QAAQ,EAAE,CAAC;oBACb,QAAQ,CAAC,KAAK,CAAC,IAAI,CAAC;wBAClB,KAAK,EAAE,IAAI,CAAC,KAAK;wBACjB,WAAW,EAAE,QAAQ,CAAC,EAAE;wBACxB,UAAU,EAAE,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,UAAU,EAAE,QAAQ,CAAC,UAAU,CAAC;qBAC3D,CAAC,CAAC;gBACL,CAAC;YACH,CAAC;QACH,CAAC;QAED,4DAA4D;QAC5D,IAAI,QAAQ,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAClC,CAAC;QAED,6BAA6B;QAC7B,IAAI,QAAQ,CAAC,KAAK,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,KAAK,CAAC,EAAE,CAAC;YACpD,QAAQ,CAAC,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC;QAClC,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED;;OAEG;IACH,mBAAmB;QACjB,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACzC,OAAO,EAAE,OAAO,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,GAAG,EAAE,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,CAAC;QAClD,CAAC;QAED,MAAM,MAAM,GAAG,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC;QAClE,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,IAAI,EAAE,EAAE,CAAC,GAAG,GAAG,IAAI,EAAE,CAAC,CAAC,GAAG,IAAI,CAAC,kBAAkB,CAAC,MAAM,CAAC;QAC9G,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;QACrD,MAAM,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,MAAM,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC,CAAC;QAErD,OAAO;YACL,OAAO,EAAE,IAAI,CAAC,KAAK,CAAC,OAAO,GAAG,GAAG,CAAC,GAAG,GAAG;YACxC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;YACvC,GAAG,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC,GAAG,IAAI,CAAC,CAAC,GAAG,GAAG,CAAC,GAAG,GAAG;YACvC,KAAK,EAAE,IAAI,CAAC,kBAAkB,CAAC,MAAM;SACtC,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,IAAY,EAAE,OAAoB;QACjE,8CAA8C;QAC9C,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CACnD,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CACjD,CAAC;QAEF,IAAI,UAAU,EAAE,CAAC;YACf,OAAO;gBACL,EAAE,EAAE,UAAU,CAAC,EAAE;gBACjB,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,KAAK,EAAE,EAAE,EAAE,0CAA0C;gBACrD,UAAU,EAAE,GAAG;aAChB,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAAC,IAAY,EAAE,OAAoB;QACjE,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QAEhE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;YACtE,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO;oBACL,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE;oBACjB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI;oBACrB,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,IAAI;oBACrB,KAAK,EAAE,EAAE;oBACT,UAAU,EAAE,KAAK,CAAC,KAAK;iBACxB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,IAAY,EAAE,OAAoB;QAChE,yEAAyE;QACzE,MAAM,YAAY,GAAG;YACnB,SAAS,EAAE,CAAC,SAAS,EAAE,MAAM,EAAE,YAAY,CAAC;YAC5C,WAAW,EAAE,CAAC,WAAW,EAAE,UAAU,EAAE,YAAY,CAAC;YACpD,UAAU,EAAE,CAAC,UAAU,EAAE,UAAU,CAAC;YACpC,WAAW,EAAE,CAAC,WAAW,EAAE,UAAU,CAAC;YACtC,OAAO,EAAE,CAAC,OAAO,EAAE,aAAa,CAAC;SAClC,CAAC;QAEF,MAAM,SAAS,GAAG,IAAI,CAAC,WAAW,EAAE,CAAC;QAErC,KAAK,MAAM,CAAC,IAAI,EAAE,QAAQ,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,YAAY,CAAC,EAAE,CAAC;YAC5D,IAAI,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC,SAAS,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,EAAE,CAAC;gBAC1D,MAAM,SAAS,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,MAAM,CAAC,EAAE,CAClD,MAAM,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC,QAAQ,CAAC,IAAI,CAAC,CACzC,CAAC;gBAEF,IAAI,SAAS,EAAE,CAAC;oBACd,OAAO;wBACL,EAAE,EAAE,SAAS,CAAC,EAAE;wBAChB,IAAI,EAAE,SAAS,CAAC,IAAI;wBACpB,IAAI,EAAE,SAAS,CAAC,IAAI;wBACpB,KAAK,EAAE,EAAE;wBACT,UAAU,EAAE,GAAG,CAAC,0CAA0C;qBAC3D,CAAC;gBACJ,CAAC;YACH,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,qBAAqB,CAAC,IAAY,EAAE,OAAoB;QAC9D,MAAM,UAAU,GAAG,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC,EAAE,CACvD,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,KAAK,IAAI,CAAC,WAAW,EAAE,CAClD,CAAC;QAEF,IAAI,UAAU,EAAE,CAAC;YACf,OAAO;gBACL,EAAE,EAAE,UAAU,CAAC,EAAE;gBACjB,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,IAAI,EAAE,UAAU,CAAC,IAAI;gBACrB,WAAW,EAAE,UAAU,CAAC,WAAW;gBACnC,UAAU,EAAE,GAAG;aAChB,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,qBAAqB,CAAC,IAAY,EAAE,OAAoB;QAC9D,MAAM,OAAO,GAAG,IAAI,CAAC,kBAAkB,CAAC,IAAI,EAAE,OAAO,CAAC,cAAc,CAAC,CAAC;QAEtE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;YACtE,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO;oBACL,EAAE,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE;oBACpB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI;oBACxB,IAAI,EAAE,KAAK,CAAC,OAAO,CAAC,IAAI;oBACxB,WAAW,EAAE,KAAK,CAAC,OAAO,CAAC,WAAW;oBACtC,UAAU,EAAE,KAAK,CAAC,KAAK;iBACxB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,qBAAqB,CAAC,IAAY,EAAE,OAAoB;QACpE,IAAI,CAAC;YACH,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,EAAE,CAAC,KAAK,CAAC;;;;;;;;;;;;;;;OAelC,EAAE,CAAC,IAAI,IAAI,GAAG,EAAE,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC,CAAC;YAEnC,IAAI,MAAM,CAAC,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC3B,MAAM,OAAO,GAAG,MAAM,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;gBAC/B,OAAO;oBACL,EAAE,EAAE,OAAO,CAAC,EAAE;oBACd,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,IAAI,EAAE,OAAO,CAAC,IAAI;oBAClB,WAAW,EAAE,QAAQ,CAAC,OAAO,CAAC,YAAY,CAAC,IAAI,CAAC;oBAChD,UAAU,EAAE,GAAG,CAAC,yCAAyC;iBAC1D,CAAC;YACJ,CAAC;QAEH,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,eAAM,CAAC,KAAK,CAAC,gCAAgC,EAAE;gBAC7C,IAAI;gBACJ,KAAK,EAAG,KAAa,CAAC,OAAO;aAC9B,CAAC,CAAC;QACL,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,kBAAkB,CAAC,SAAiB,EAAE,OAAoB;QAChE,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACjD,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,KAAK,SAAS,CAAC,WAAW,EAAE,CACrD,CAAC;QAEF,IAAI,UAAU,EAAE,CAAC;YACf,OAAO;gBACL,EAAE,EAAE,UAAU,CAAC,EAAE;gBACjB,KAAK,EAAE,UAAU,CAAC,KAAK;gBACvB,MAAM,EAAE,UAAU,CAAC,MAAM;gBACzB,UAAU,EAAE,UAAU,CAAC,UAAU;gBACjC,UAAU,EAAE,GAAG;aAChB,CAAC;QACJ,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,kBAAkB,CAAC,SAAiB,EAAE,OAAoB;QAChE,MAAM,OAAO,GAAG,IAAI,CAAC,eAAe,CAAC,SAAS,EAAE,OAAO,CAAC,WAAW,CAAC,CAAC;QAErE,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,EAAE,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC,KAAK,GAAG,GAAG,EAAE,CAAC;YACtE,MAAM,KAAK,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC;YACzB,IAAI,KAAK,EAAE,CAAC;gBACV,OAAO;oBACL,EAAE,EAAE,KAAK,CAAC,IAAI,CAAC,EAAE;oBACjB,KAAK,EAAE,KAAK,CAAC,IAAI,CAAC,KAAK;oBACvB,MAAM,EAAE,KAAK,CAAC,IAAI,CAAC,MAAM;oBACzB,UAAU,EAAE,KAAK,CAAC,IAAI,CAAC,UAAU;oBACjC,UAAU,EAAE,KAAK,CAAC,KAAK;iBACxB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAEO,KAAK,CAAC,uBAAuB,CAAC,SAAiB,EAAE,OAAoB;QAC3E,MAAM,QAAQ,GAAG,SAAS,CAAC,WAAW,EAAE,CAAC;QAEzC,+BAA+B;QAC/B,IAAI,QAAQ,CAAC,QAAQ,CAAC,WAAW,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,cAAc,CAAC,EAAE,CAAC;YACxE,0BAA0B;YAC1B,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAC,CAAC;YAC1C,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO;oBACL,EAAE,EAAE,UAAU,CAAC,EAAE;oBACjB,KAAK,EAAE,UAAU,CAAC,KAAK;oBACvB,MAAM,EAAE,UAAU,CAAC,MAAM;oBACzB,UAAU,EAAE,UAAU,CAAC,UAAU;oBACjC,UAAU,EAAE,GAAG;iBAChB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,IAAI,QAAQ,CAAC,QAAQ,CAAC,QAAQ,CAAC,IAAI,QAAQ,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YACjE,oBAAoB;YACpB,MAAM,UAAU,GAAG,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CACjD,IAAI,CAAC,OAAO,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,CAAC,CAAC,sBAAsB;aACjG,CAAC;YAEF,IAAI,UAAU,EAAE,CAAC;gBACf,OAAO;oBACL,EAAE,EAAE,UAAU,CAAC,EAAE;oBACjB,KAAK,EAAE,UAAU,CAAC,KAAK;oBACvB,MAAM,EAAE,UAAU,CAAC,MAAM;oBACzB,UAAU,EAAE,UAAU,CAAC,UAAU;oBACjC,UAAU,EAAE,GAAG;iBAChB,CAAC;YACJ,CAAC;QACH,CAAC;QAED,OAAO,IAAI,CAAC;IACd,CAAC;IAED,uCAAuC;IAC/B,eAAe,CAAC,KAAa,EAAE,KAAiC;QACtE,OAAO,KAAK;aACT,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACZ,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;SAC9E,CAAC,CAAC;aACF,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC;aAClC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAEO,kBAAkB,CAAC,KAAa,EAAE,QAAuC;QAC/E,OAAO,QAAQ;aACZ,GAAG,CAAC,OAAO,CAAC,EAAE,CAAC,CAAC;YACf,OAAO;YACP,KAAK,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,OAAO,CAAC,IAAI,CAAC,WAAW,EAAE,CAAC;SACjF,CAAC,CAAC;aACF,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC;aAClC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAEO,eAAe,CAAC,KAAa,EAAE,KAAiC;QACtE,OAAO,KAAK;aACT,GAAG,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;YACZ,IAAI;YACJ,KAAK,EAAE,IAAI,CAAC,mBAAmB,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,WAAW,EAAE,CAAC;SAC/E,CAAC,CAAC;aACF,MAAM,CAAC,KAAK,CAAC,EAAE,CAAC,KAAK,CAAC,KAAK,GAAG,GAAG,CAAC;aAClC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,GAAG,CAAC,CAAC,KAAK,CAAC,CAAC;IACvC,CAAC;IAED,qDAAqD;IAC7C,mBAAmB,CAAC,IAAY,EAAE,IAAY;QACpD,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,GAAG,CAAC;QAE9B,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAC1C,MAAM,MAAM,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC;QAE1C,MAAM,YAAY,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,CAAC,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC3E,MAAM,KAAK,GAAG,IAAI,GAAG,CAAC,CAAC,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC,CAAC,CAAC;QAE9C,IAAI,KAAK,CAAC,IAAI,KAAK,CAAC;YAAE,OAAO,CAAC,CAAC;QAE/B,MAAM,iBAAiB,GAAG,YAAY,CAAC,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC;QAEzD,8BAA8B;QAC9B,MAAM,cAAc,GAAG,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,CAAC;QAE5E,OAAO,IAAI,CAAC,GAAG,CAAC,GAAG,EAAE,iBAAiB,GAAG,cAAc,CAAC,CAAC;IAC3D,CAAC;IAEO,iBAAiB,CAAC,IAAY;QACpC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QAEnC,mCAAmC;QACnC,IAAI,IAAI,CAAC,kBAAkB,CAAC,MAAM,GAAG,IAAI,EAAE,CAAC;YAC1C,IAAI,CAAC,kBAAkB,CAAC,KAAK,EAAE,CAAC;QAClC,CAAC;IACH,CAAC;CACF;AAniBD,wCAmiBC"}
\ No newline at end of file
diff --git a/backend/dist/ai/context/TemporalProcessor.d.ts b/backend/dist/ai/context/TemporalProcessor.d.ts
deleted file mode 100644
index 6a851e9..0000000
--- a/backend/dist/ai/context/TemporalProcessor.d.ts
+++ /dev/null
@@ -1,80 +0,0 @@
-/**
- * Temporal Processor - Phase 2 AI Intelligence
- * Processes temporal references in voice commands
- *
- * Success Criteria:
- * - Handles "next Friday", "in 2 weeks", "tomorrow"
- * - Timezone-aware date resolution
- * - Business day calculations
- * - 90%+ accuracy for common date expressions
- */
-export interface ResolvedDate {
- date: Date;
- confidence: number;
- originalText: string;
- interpretation: string;
-}
-export interface TemporalContext {
- currentTime: string;
- timezone: string;
- businessHours: {
- start: string;
- end: string;
- };
- workingDays: number[];
-}
-export declare class TemporalProcessor {
- private readonly WEEKDAYS;
- private readonly MONTHS;
- private readonly TIME_PATTERNS;
- constructor();
- /**
- * Get current temporal context for a timezone
- */
- getCurrentTemporalContext(timezone?: string): TemporalContext;
- /**
- * Resolve a date expression to actual date
- */
- resolveDate(dateText: string, context: TemporalContext): Promise;
- /**
- * Parse multiple date references in text
- */
- resolveDatesInText(text: string, context: TemporalContext): Promise;
- /**
- * Check if a date is a business day
- */
- isBusinessDay(date: Date, context: TemporalContext): boolean;
- /**
- * Get next business day from a given date
- */
- getNextBusinessDay(date: Date, context: TemporalContext): Date;
- /**
- * Add business days to a date
- */
- addBusinessDays(date: Date, days: number, context: TemporalContext): Date;
- private handleToday;
- private handleTomorrow;
- private handleYesterday;
- private handleNextWeekday;
- private handleThisWeekday;
- private handleLastWeekday;
- private handleWeekday;
- private handleNextWeek;
- private handleThisWeek;
- private handleLastWeek;
- private handleNextMonth;
- private handleThisMonth;
- private handleLastMonth;
- private handleInDays;
- private handleInWeeks;
- private handleInMonths;
- private handleByWeekday;
- private handleByRelative;
- private handleByEndOf;
- private handleNumericDate;
- private handleMonthDay;
- private handleTimeSpec;
- private handleSimpleTime;
- private parseNaturalLanguageDate;
-}
-//# sourceMappingURL=TemporalProcessor.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/ai/context/TemporalProcessor.d.ts.map b/backend/dist/ai/context/TemporalProcessor.d.ts.map
deleted file mode 100644
index 7031cee..0000000
--- a/backend/dist/ai/context/TemporalProcessor.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"TemporalProcessor.d.ts","sourceRoot":"","sources":["../../../src/ai/context/TemporalProcessor.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,IAAI,CAAC;IACX,UAAU,EAAE,MAAM,CAAC;IACnB,YAAY,EAAE,MAAM,CAAC;IACrB,cAAc,EAAE,MAAM,CAAC;CACxB;AAED,MAAM,WAAW,eAAe;IAC9B,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE;QACb,KAAK,EAAE,MAAM,CAAC;QACd,GAAG,EAAE,MAAM,CAAC;KACb,CAAC;IACF,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,QAAQ,CAAkF;IAC3G,OAAO,CAAC,QAAQ,CAAC,MAAM,CAGrB;IAGF,OAAO,CAAC,QAAQ,CAAC,aAAa,CAyC5B;;IAMF;;OAEG;IACH,yBAAyB,CAAC,QAAQ,GAAE,MAAc,GAAG,eAAe;IAiBpE;;OAEG;IACG,WAAW,CACf,QAAQ,EAAE,MAAM,EAChB,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,YAAY,GAAG,IAAI,CAAC;IAiD/B;;OAEG;IACG,kBAAkB,CACtB,IAAI,EAAE,MAAM,EACZ,OAAO,EAAE,eAAe,GACvB,OAAO,CAAC,YAAY,EAAE,CAAC;IAkC1B;;OAEG;IACH,aAAa,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,GAAG,OAAO;IAO5D;;OAEG;IACH,kBAAkB,CAAC,IAAI,EAAE,IAAI,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IAU9D;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,eAAe,GAAG,IAAI;IAezE,OAAO,CAAC,WAAW;IASnB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,iBAAiB;IAkBzB,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,aAAa;IAKrB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,cAAc;IAgBtB,OAAO,CAAC,cAAc;IAYtB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,eAAe;IAavB,OAAO,CAAC,eAAe;IAYvB,OAAO,CAAC,YAAY;IAapB,OAAO,CAAC,aAAa;IAarB,OAAO,CAAC,cAAc;IAatB,OAAO,CAAC,eAAe;IAWvB,OAAO,CAAC,gBAAgB;IAexB,OAAO,CAAC,aAAa;IA6BrB,OAAO,CAAC,iBAAiB;IAoBzB,OAAO,CAAC,cAAc;IAoBtB,OAAO,CAAC,cAAc;IAuBtB,OAAO,CAAC,gBAAgB;IAsBxB,OAAO,CAAC,wBAAwB;CAmCjC"}
\ No newline at end of file
diff --git a/backend/dist/ai/context/TemporalProcessor.js b/backend/dist/ai/context/TemporalProcessor.js
deleted file mode 100644
index eb0f9a2..0000000
--- a/backend/dist/ai/context/TemporalProcessor.js
+++ /dev/null
@@ -1,516 +0,0 @@
-"use strict";
-/**
- * Temporal Processor - Phase 2 AI Intelligence
- * Processes temporal references in voice commands
- *
- * Success Criteria:
- * - Handles "next Friday", "in 2 weeks", "tomorrow"
- * - Timezone-aware date resolution
- * - Business day calculations
- * - 90%+ accuracy for common date expressions
- */
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.TemporalProcessor = void 0;
-const logger_1 = require("../../utils/logger");
-class TemporalProcessor {
- WEEKDAYS = ['sunday', 'monday', 'tuesday', 'wednesday', 'thursday', 'friday', 'saturday'];
- MONTHS = [
- 'january', 'february', 'march', 'april', 'may', 'june',
- 'july', 'august', 'september', 'october', 'november', 'december'
- ];
- // Common time patterns
- TIME_PATTERNS = [
- // Relative days
- { pattern: /\b(today|this day)\b/i, handler: this.handleToday.bind(this) },
- { pattern: /\b(tomorrow|next day)\b/i, handler: this.handleTomorrow.bind(this) },
- { pattern: /\b(yesterday|last day)\b/i, handler: this.handleYesterday.bind(this) },
- // Relative weeks
- { pattern: /\bnext (monday|tuesday|wednesday|thursday|friday|saturday|sunday)\b/i, handler: this.handleNextWeekday.bind(this) },
- { pattern: /\bthis (monday|tuesday|wednesday|thursday|friday|saturday|sunday)\b/i, handler: this.handleThisWeekday.bind(this) },
- { pattern: /\blast (monday|tuesday|wednesday|thursday|friday|saturday|sunday)\b/i, handler: this.handleLastWeekday.bind(this) },
- // Specific weekdays
- { pattern: /\b(monday|tuesday|wednesday|thursday|friday|saturday|sunday)\b/i, handler: this.handleWeekday.bind(this) },
- // Week references
- { pattern: /\bnext week\b/i, handler: this.handleNextWeek.bind(this) },
- { pattern: /\bthis week\b/i, handler: this.handleThisWeek.bind(this) },
- { pattern: /\blast week\b/i, handler: this.handleLastWeek.bind(this) },
- // Month references
- { pattern: /\bnext month\b/i, handler: this.handleNextMonth.bind(this) },
- { pattern: /\bthis month\b/i, handler: this.handleThisMonth.bind(this) },
- { pattern: /\blast month\b/i, handler: this.handleLastMonth.bind(this) },
- // Relative time periods
- { pattern: /\bin (\d+) (day|days)\b/i, handler: this.handleInDays.bind(this) },
- { pattern: /\bin (\d+) (week|weeks)\b/i, handler: this.handleInWeeks.bind(this) },
- { pattern: /\bin (\d+) (month|months)\b/i, handler: this.handleInMonths.bind(this) },
- // By/before/after patterns
- { pattern: /\bby (next )?(monday|tuesday|wednesday|thursday|friday|saturday|sunday)\b/i, handler: this.handleByWeekday.bind(this) },
- { pattern: /\bby (tomorrow|next week|next month)\b/i, handler: this.handleByRelative.bind(this) },
- { pattern: /\bby the end of (this|next)? ?(week|month)\b/i, handler: this.handleByEndOf.bind(this) },
- // Specific dates (basic)
- { pattern: /\b(\d{1,2})\/(\d{1,2})\/(\d{4}|\d{2})\b/, handler: this.handleNumericDate.bind(this) },
- { pattern: /\b(january|february|march|april|may|june|july|august|september|october|november|december) (\d{1,2})\b/i, handler: this.handleMonthDay.bind(this) },
- // Time specifications
- { pattern: /\bat (\d{1,2}):(\d{2})\s?(am|pm|AM|PM)?\b/i, handler: this.handleTimeSpec.bind(this) },
- { pattern: /\bat (\d{1,2})\s?(am|pm|AM|PM)\b/i, handler: this.handleSimpleTime.bind(this) },
- ];
- constructor() {
- logger_1.logger.debug('Temporal Processor initialized');
- }
- /**
- * Get current temporal context for a timezone
- */
- getCurrentTemporalContext(timezone = 'UTC') {
- const now = new Date();
- // Convert to specified timezone (simplified - in production use proper timezone library)
- const currentTime = now.toISOString();
- return {
- currentTime,
- timezone,
- businessHours: {
- start: '09:00',
- end: '17:00'
- },
- workingDays: [1, 2, 3, 4, 5] // Monday to Friday
- };
- }
- /**
- * Resolve a date expression to actual date
- */
- async resolveDate(dateText, context) {
- try {
- const baseDate = new Date(context.currentTime);
- const originalText = dateText.trim();
- const lowerText = originalText.toLowerCase();
- // Try each pattern
- for (const { pattern, handler } of this.TIME_PATTERNS) {
- const match = lowerText.match(pattern);
- if (match) {
- const result = handler(match, baseDate);
- if (result) {
- logger_1.logger.debug('Date resolved', {
- originalText,
- resolvedDate: result.date.toISOString(),
- confidence: result.confidence,
- interpretation: result.interpretation
- });
- return {
- ...result,
- originalText
- };
- }
- }
- }
- // Try natural language parsing as fallback
- const fallbackResult = this.parseNaturalLanguageDate(lowerText, baseDate);
- if (fallbackResult) {
- return {
- ...fallbackResult,
- originalText
- };
- }
- logger_1.logger.debug('Date resolution failed', { originalText });
- return null;
- }
- catch (error) {
- logger_1.logger.error('Date resolution error', {
- dateText,
- error: error.message
- });
- return null;
- }
- }
- /**
- * Parse multiple date references in text
- */
- async resolveDatesInText(text, context) {
- const results = [];
- const processedRanges = [];
- // Find all potential date references
- for (const { pattern } of this.TIME_PATTERNS) {
- let match;
- const regex = new RegExp(pattern.source, pattern.flags + 'g');
- while ((match = regex.exec(text)) !== null) {
- const start = match.index;
- const end = start + match[0].length;
- // Check if this range overlaps with already processed ranges
- const overlaps = processedRanges.some(range => (start >= range.start && start <= range.end) ||
- (end >= range.start && end <= range.end));
- if (!overlaps) {
- const dateText = match[0];
- const resolved = await this.resolveDate(dateText, context);
- if (resolved) {
- results.push(resolved);
- processedRanges.push({ start, end });
- }
- }
- }
- }
- return results;
- }
- /**
- * Check if a date is a business day
- */
- isBusinessDay(date, context) {
- const dayOfWeek = date.getDay(); // 0 = Sunday, 6 = Saturday
- const adjustedDay = dayOfWeek === 0 ? 7 : dayOfWeek; // Convert to 1-7 scale
- return context.workingDays.includes(adjustedDay);
- }
- /**
- * Get next business day from a given date
- */
- getNextBusinessDay(date, context) {
- const result = new Date(date);
- do {
- result.setDate(result.getDate() + 1);
- } while (!this.isBusinessDay(result, context));
- return result;
- }
- /**
- * Add business days to a date
- */
- addBusinessDays(date, days, context) {
- const result = new Date(date);
- let addedDays = 0;
- while (addedDays < days) {
- result.setDate(result.getDate() + 1);
- if (this.isBusinessDay(result, context)) {
- addedDays++;
- }
- }
- return result;
- }
- // Handler methods for different date patterns
- handleToday(match, baseDate) {
- return {
- date: new Date(baseDate),
- confidence: 1.0,
- originalText: match[0],
- interpretation: 'Today'
- };
- }
- handleTomorrow(match, baseDate) {
- const date = new Date(baseDate);
- date.setDate(date.getDate() + 1);
- return {
- date,
- confidence: 1.0,
- originalText: match[0],
- interpretation: 'Tomorrow'
- };
- }
- handleYesterday(match, baseDate) {
- const date = new Date(baseDate);
- date.setDate(date.getDate() - 1);
- return {
- date,
- confidence: 1.0,
- originalText: match[0],
- interpretation: 'Yesterday'
- };
- }
- handleNextWeekday(match, baseDate) {
- const weekday = (match[1] || '').toLowerCase();
- const targetDay = this.WEEKDAYS.indexOf(weekday);
- const currentDay = baseDate.getDay();
- const date = new Date(baseDate);
- let daysToAdd = targetDay - currentDay;
- if (daysToAdd <= 0) {
- daysToAdd += 7; // Next week
- }
- date.setDate(date.getDate() + daysToAdd);
- return {
- date,
- confidence: 0.95,
- originalText: match[0],
- interpretation: `Next ${weekday}`
- };
- }
- handleThisWeekday(match, baseDate) {
- const weekday = (match[1] || '').toLowerCase();
- const targetDay = this.WEEKDAYS.indexOf(weekday);
- const currentDay = baseDate.getDay();
- const date = new Date(baseDate);
- const daysToAdd = targetDay - currentDay;
- date.setDate(date.getDate() + daysToAdd);
- return {
- date,
- confidence: 0.9,
- originalText: match[0],
- interpretation: `This ${weekday}`
- };
- }
- handleLastWeekday(match, baseDate) {
- const weekday = (match[1] || '').toLowerCase();
- const targetDay = this.WEEKDAYS.indexOf(weekday);
- const currentDay = baseDate.getDay();
- const date = new Date(baseDate);
- let daysToSubtract = currentDay - targetDay;
- if (daysToSubtract <= 0) {
- daysToSubtract += 7; // Last week
- }
- date.setDate(date.getDate() - daysToSubtract);
- return {
- date,
- confidence: 0.9,
- originalText: match[0],
- interpretation: `Last ${weekday}`
- };
- }
- handleWeekday(match, baseDate) {
- // Default to next occurrence of this weekday
- return this.handleNextWeekday(['next ' + match[0], match[0]], baseDate);
- }
- handleNextWeek(match, baseDate) {
- const date = new Date(baseDate);
- date.setDate(date.getDate() + 7);
- return {
- date,
- confidence: 0.8,
- originalText: match[0],
- interpretation: 'Next week (same day)'
- };
- }
- handleThisWeek(match, baseDate) {
- // Return Friday of this week as default
- const date = new Date(baseDate);
- const currentDay = baseDate.getDay();
- const daysToFriday = 5 - currentDay;
- date.setDate(date.getDate() + daysToFriday);
- return {
- date,
- confidence: 0.7,
- originalText: match[0],
- interpretation: 'This week (Friday)'
- };
- }
- handleLastWeek(match, baseDate) {
- const date = new Date(baseDate);
- date.setDate(date.getDate() - 7);
- return {
- date,
- confidence: 0.8,
- originalText: match[0],
- interpretation: 'Last week (same day)'
- };
- }
- handleNextMonth(match, baseDate) {
- const date = new Date(baseDate);
- date.setMonth(date.getMonth() + 1);
- return {
- date,
- confidence: 0.8,
- originalText: match[0],
- interpretation: 'Next month (same day)'
- };
- }
- handleThisMonth(match, baseDate) {
- // Return end of this month
- const date = new Date(baseDate);
- date.setMonth(date.getMonth() + 1, 0); // Last day of current month
- return {
- date,
- confidence: 0.7,
- originalText: match[0],
- interpretation: 'End of this month'
- };
- }
- handleLastMonth(match, baseDate) {
- const date = new Date(baseDate);
- date.setMonth(date.getMonth() - 1);
- return {
- date,
- confidence: 0.8,
- originalText: match[0],
- interpretation: 'Last month (same day)'
- };
- }
- handleInDays(match, baseDate) {
- const days = parseInt(match[1] || '0');
- const date = new Date(baseDate);
- date.setDate(date.getDate() + days);
- return {
- date,
- confidence: 0.95,
- originalText: match[0],
- interpretation: `In ${days} day${days > 1 ? 's' : ''}`
- };
- }
- handleInWeeks(match, baseDate) {
- const weeks = parseInt(match[1] || '0');
- const date = new Date(baseDate);
- date.setDate(date.getDate() + (weeks * 7));
- return {
- date,
- confidence: 0.9,
- originalText: match[0],
- interpretation: `In ${weeks} week${weeks > 1 ? 's' : ''}`
- };
- }
- handleInMonths(match, baseDate) {
- const months = parseInt(match[1] || '0');
- const date = new Date(baseDate);
- date.setMonth(date.getMonth() + months);
- return {
- date,
- confidence: 0.85,
- originalText: match[0],
- interpretation: `In ${months} month${months > 1 ? 's' : ''}`
- };
- }
- handleByWeekday(match, baseDate) {
- const weekday = (match[2] || '').toLowerCase();
- const isNext = match[1] && match[1].toLowerCase().includes('next');
- if (isNext) {
- return this.handleNextWeekday(['', weekday], baseDate);
- }
- else {
- return this.handleThisWeekday(['', weekday], baseDate);
- }
- }
- handleByRelative(match, baseDate) {
- const timeRef = (match[1] || '').toLowerCase();
- if (timeRef === 'tomorrow') {
- return this.handleTomorrow(['tomorrow'], baseDate);
- }
- else if (timeRef === 'next week') {
- return this.handleNextWeek(['next week'], baseDate);
- }
- else if (timeRef === 'next month') {
- return this.handleNextMonth(['next month'], baseDate);
- }
- // Default fallback - return tomorrow
- return this.handleTomorrow(['tomorrow'], baseDate);
- }
- handleByEndOf(match, baseDate) {
- const period = (match[2] || '').toLowerCase();
- const isNext = match[1] && match[1].toLowerCase() === 'next';
- const date = new Date(baseDate);
- if (period === 'week') {
- // End of week (Sunday)
- const daysToSunday = 7 - date.getDay();
- date.setDate(date.getDate() + daysToSunday);
- if (isNext) {
- date.setDate(date.getDate() + 7);
- }
- }
- else if (period === 'month') {
- // End of month
- if (isNext) {
- date.setMonth(date.getMonth() + 1);
- }
- date.setMonth(date.getMonth() + 1, 0); // Last day of month
- }
- return {
- date,
- confidence: 0.85,
- originalText: match[0],
- interpretation: `By end of ${isNext ? 'next' : 'this'} ${period}`
- };
- }
- handleNumericDate(match, baseDate) {
- const month = parseInt(match[1] || '1') - 1; // Month is 0-indexed
- const day = parseInt(match[2] || '1');
- let year = parseInt(match[3] || new Date().getFullYear().toString());
- // Handle 2-digit years
- if (year < 100) {
- year += year < 50 ? 2000 : 1900;
- }
- const date = new Date(year, month, day);
- return {
- date,
- confidence: 0.95,
- originalText: match[0],
- interpretation: `Specific date: ${match[0]}`
- };
- }
- handleMonthDay(match, baseDate) {
- const monthName = (match[1] || '').toLowerCase();
- const day = parseInt(match[2] || '1');
- const month = this.MONTHS.indexOf(monthName);
- const date = new Date(baseDate.getFullYear(), month, day);
- // If the date has passed this year, assume next year
- if (date < baseDate) {
- date.setFullYear(date.getFullYear() + 1);
- }
- return {
- date,
- confidence: 0.9,
- originalText: match[0],
- interpretation: `${monthName} ${day}`
- };
- }
- handleTimeSpec(match, baseDate) {
- const hour = parseInt(match[1] || '0');
- const minute = parseInt(match[2] || '0');
- const period = match[3]?.toLowerCase();
- let adjustedHour = hour;
- if (period === 'pm' && hour < 12) {
- adjustedHour += 12;
- }
- else if (period === 'am' && hour === 12) {
- adjustedHour = 0;
- }
- const date = new Date(baseDate);
- date.setHours(adjustedHour, minute, 0, 0);
- return {
- date,
- confidence: 0.9,
- originalText: match[0],
- interpretation: `Time: ${hour}:${minute.toString().padStart(2, '0')} ${period || ''}`
- };
- }
- handleSimpleTime(match, baseDate) {
- const hour = parseInt(match[1] || '0');
- const period = match[2]?.toLowerCase();
- let adjustedHour = hour;
- if (period === 'pm' && hour < 12) {
- adjustedHour += 12;
- }
- else if (period === 'am' && hour === 12) {
- adjustedHour = 0;
- }
- const date = new Date(baseDate);
- date.setHours(adjustedHour, 0, 0, 0);
- return {
- date,
- confidence: 0.85,
- originalText: match[0],
- interpretation: `Time: ${hour} ${period || ''}`
- };
- }
- parseNaturalLanguageDate(text, baseDate) {
- // Simple fallback parsing for common phrases
- const phrases = {
- 'end of week': () => {
- const date = new Date(baseDate);
- const daysToSunday = 7 - date.getDay();
- date.setDate(date.getDate() + daysToSunday);
- return date;
- },
- 'start of week': () => {
- const date = new Date(baseDate);
- const daysToMonday = date.getDay() === 0 ? 1 : (8 - date.getDay());
- date.setDate(date.getDate() + daysToMonday);
- return date;
- },
- 'end of day': () => {
- const date = new Date(baseDate);
- date.setHours(23, 59, 59, 999);
- return date;
- }
- };
- for (const [phrase, dateCalculator] of Object.entries(phrases)) {
- if (text.includes(phrase)) {
- return {
- date: dateCalculator(),
- confidence: 0.7,
- originalText: phrase,
- interpretation: phrase
- };
- }
- }
- return null;
- }
-}
-exports.TemporalProcessor = TemporalProcessor;
-//# sourceMappingURL=TemporalProcessor.js.map
\ No newline at end of file
diff --git a/backend/dist/ai/context/TemporalProcessor.js.map b/backend/dist/ai/context/TemporalProcessor.js.map
deleted file mode 100644
index c830ed8..0000000
--- a/backend/dist/ai/context/TemporalProcessor.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"TemporalProcessor.js","sourceRoot":"","sources":["../../../src/ai/context/TemporalProcessor.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/ai/execution/DependencyResolver.d.ts b/backend/dist/ai/execution/DependencyResolver.d.ts
deleted file mode 100644
index af0cabe..0000000
--- a/backend/dist/ai/execution/DependencyResolver.d.ts
+++ /dev/null
@@ -1,117 +0,0 @@
-/**
- * Dependency Resolver - Phase 2 Multi-Action Execution
- * Resolves dependencies between actions in complex voice commands
- *
- * Success Criteria:
- * - Identifies implicit and explicit dependencies between actions
- * - Creates optimal execution order with parallel execution where possible
- * - Handles circular dependency detection and prevention
- * - Supports dependency resolution in <100ms
- */
-export interface Action {
- id: string;
- type: string;
- parameters: Record;
- dependencies?: string[];
- metadata?: {
- priority: number;
- estimatedDuration: number;
- requiresInput?: boolean;
- producesOutput?: boolean;
- };
-}
-export interface DependencyGraph {
- nodes: Map;
- edges: Set;
- levels: DependencyLevel[];
-}
-export interface DependencyNode {
- action: Action;
- dependsOn: Set;
- dependents: Set;
- level: number;
- canRunInParallel: boolean;
-}
-export interface DependencyLevel {
- level: number;
- actions: Action[];
- parallelizable: boolean;
- estimatedDuration: number;
-}
-export interface ExecutionPlan {
- totalEstimatedTime: number;
- parallelStages: ExecutionStage[];
- dependencyChain: string[];
- riskAssessment: RiskAssessment;
-}
-export interface ExecutionStage {
- stageId: string;
- level: number;
- actions: Action[];
- parallelExecution: boolean;
- estimatedDuration: number;
- prerequisites: string[];
-}
-export interface OptimizedPlan extends ExecutionPlan {
- optimizations: Optimization[];
- performanceGains: PerformanceGains;
-}
-export interface Optimization {
- type: 'parallelization' | 'reordering' | 'batching' | 'caching';
- description: string;
- impact: number;
- appliedTo: string[];
-}
-export interface PerformanceGains {
- originalEstimatedTime: number;
- optimizedEstimatedTime: number;
- timeSavings: number;
- parallelizationGains: number;
-}
-export interface RiskAssessment {
- riskLevel: 'low' | 'medium' | 'high';
- potentialIssues: string[];
- mitigations: string[];
- failureRecovery: string[];
-}
-export declare class DependencyResolver {
- private performanceMetrics;
- constructor();
- /**
- * Analyze dependencies between actions and create dependency graph
- * Target: <100ms processing time
- */
- analyzeDependencies(actions: Action[]): Promise;
- /**
- * Create execution plan from dependency graph
- */
- createExecutionPlan(graph: DependencyGraph): Promise;
- /**
- * Optimize execution plan for better performance
- */
- optimizeExecutionOrder(plan: ExecutionPlan): Promise;
- /**
- * Get performance statistics
- */
- getPerformanceStats(): {
- average: number;
- p95: number;
- p99: number;
- count: number;
- };
- private analyzeExplicitDependencies;
- private analyzeImplicitDependencies;
- private shouldCreateImplicitDependency;
- private calculateDependencyLevels;
- private detectCircularDependencies;
- private createExecutionLevels;
- private getStagePrerequisites;
- private assessExecutionRisks;
- private optimizeParallelization;
- private optimizeActionOrdering;
- private optimizeBatching;
- private optimizeCaching;
- private isBatchableActionType;
- private recordPerformance;
-}
-//# sourceMappingURL=DependencyResolver.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/ai/execution/DependencyResolver.d.ts.map b/backend/dist/ai/execution/DependencyResolver.d.ts.map
deleted file mode 100644
index 9694602..0000000
--- a/backend/dist/ai/execution/DependencyResolver.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"DependencyResolver.d.ts","sourceRoot":"","sources":["../../../src/ai/execution/DependencyResolver.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/ai/execution/DependencyResolver.js b/backend/dist/ai/execution/DependencyResolver.js
deleted file mode 100644
index debee52..0000000
--- a/backend/dist/ai/execution/DependencyResolver.js
+++ /dev/null
@@ -1,586 +0,0 @@
-"use strict";
-/**
- * Dependency Resolver - Phase 2 Multi-Action Execution
- * Resolves dependencies between actions in complex voice commands
- *
- * Success Criteria:
- * - Identifies implicit and explicit dependencies between actions
- * - Creates optimal execution order with parallel execution where possible
- * - Handles circular dependency detection and prevention
- * - Supports dependency resolution in <100ms
- */
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.DependencyResolver = void 0;
-const perf_hooks_1 = require("perf_hooks");
-const logger_1 = require("../../utils/logger");
-const types_1 = require("../../voice/types");
-class DependencyResolver {
- performanceMetrics = [];
- constructor() {
- logger_1.logger.info('Dependency Resolver initialized');
- }
- /**
- * Analyze dependencies between actions and create dependency graph
- * Target: <100ms processing time
- */
- async analyzeDependencies(actions) {
- const startTime = perf_hooks_1.performance.now();
- if (!actions || actions.length === 0) {
- throw new types_1.AIProcessingError('No actions provided for dependency analysis');
- }
- try {
- logger_1.logger.debug('Analyzing dependencies for actions', {
- actionCount: actions.length,
- actionTypes: actions.map(a => a.type)
- });
- // Create dependency graph
- const graph = {
- nodes: new Map(),
- edges: new Set(),
- levels: []
- };
- // Initialize nodes
- for (const action of actions) {
- const node = {
- action,
- dependsOn: new Set(),
- dependents: new Set(),
- level: 0,
- canRunInParallel: true
- };
- graph.nodes.set(action.id, node);
- }
- // Analyze explicit dependencies
- this.analyzeExplicitDependencies(actions, graph);
- // Analyze implicit dependencies
- await this.analyzeImplicitDependencies(actions, graph);
- // Calculate dependency levels
- this.calculateDependencyLevels(graph);
- // Check for circular dependencies
- this.detectCircularDependencies(graph);
- // Create execution levels
- this.createExecutionLevels(graph);
- const processingTime = perf_hooks_1.performance.now() - startTime;
- this.recordPerformance(processingTime);
- logger_1.logger.debug('Dependency analysis completed', {
- processingTime: `${processingTime.toFixed(2)}ms`,
- nodeCount: graph.nodes.size,
- edgeCount: graph.edges.size,
- levelCount: graph.levels.length
- });
- return graph;
- }
- catch (error) {
- const processingTime = perf_hooks_1.performance.now() - startTime;
- this.recordPerformance(processingTime);
- const errorMessage = error instanceof Error ? error.message : String(error);
- logger_1.logger.error('Dependency analysis failed', {
- error: errorMessage,
- processingTime: `${processingTime.toFixed(2)}ms`,
- actionCount: actions.length
- });
- throw new types_1.AIProcessingError('Failed to analyze action dependencies', {
- actionCount: actions.length,
- processingTime,
- originalError: errorMessage
- });
- }
- }
- /**
- * Create execution plan from dependency graph
- */
- async createExecutionPlan(graph) {
- const startTime = perf_hooks_1.performance.now();
- try {
- const stages = [];
- let totalEstimatedTime = 0;
- const dependencyChain = [];
- // Create execution stages from dependency levels
- for (let i = 0; i < graph.levels.length; i++) {
- const level = graph.levels[i];
- if (!level) {
- throw new types_1.AIProcessingError('Invalid dependency level in graph', {
- levelIndex: i,
- totalLevels: graph.levels.length
- });
- }
- const stageId = `stage-${i}`;
- const stage = {
- stageId,
- level: i,
- actions: level.actions,
- parallelExecution: level.parallelizable && level.actions.length > 1,
- estimatedDuration: level.estimatedDuration,
- prerequisites: this.getStagePrerequisites(level, graph)
- };
- stages.push(stage);
- // For parallel stages, use the max duration. For sequential, add durations
- if (stage.parallelExecution) {
- totalEstimatedTime += Math.max(...level.actions.map(a => a.metadata?.estimatedDuration || 1000));
- }
- else {
- totalEstimatedTime += level.estimatedDuration;
- }
- // Build dependency chain
- dependencyChain.push(...level.actions.map(a => a.id));
- }
- // Assess risks
- const riskAssessment = this.assessExecutionRisks(stages, graph);
- const plan = {
- totalEstimatedTime,
- parallelStages: stages,
- dependencyChain,
- riskAssessment
- };
- const processingTime = perf_hooks_1.performance.now() - startTime;
- logger_1.logger.debug('Execution plan created', {
- processingTime: `${processingTime.toFixed(2)}ms`,
- stageCount: stages.length,
- totalEstimatedTime: `${totalEstimatedTime}ms`,
- parallelizableStages: stages.filter(s => s.parallelExecution).length
- });
- return plan;
- }
- catch (error) {
- const errorMessage = error instanceof Error ? error.message : String(error);
- logger_1.logger.error('Failed to create execution plan', {
- error: errorMessage,
- graphNodes: graph.nodes.size
- });
- throw new types_1.AIProcessingError('Failed to create execution plan', {
- graphSize: graph.nodes.size,
- originalError: errorMessage
- });
- }
- }
- /**
- * Optimize execution plan for better performance
- */
- async optimizeExecutionOrder(plan) {
- const startTime = perf_hooks_1.performance.now();
- try {
- const optimizations = [];
- let optimizedStages = [...plan.parallelStages];
- // Optimization 1: Maximize parallelization
- const parallelizationGains = this.optimizeParallelization(optimizedStages);
- if (parallelizationGains.impact > 0) {
- optimizations.push(parallelizationGains);
- }
- // Optimization 2: Reorder actions within stages for efficiency
- const reorderingGains = this.optimizeActionOrdering(optimizedStages);
- if (reorderingGains.impact > 0) {
- optimizations.push(reorderingGains);
- }
- // Optimization 3: Batch similar actions
- const batchingGains = this.optimizeBatching(optimizedStages);
- if (batchingGains.impact > 0) {
- optimizations.push(batchingGains);
- }
- // Optimization 4: Cache repeated operations
- const cachingGains = this.optimizeCaching(optimizedStages);
- if (cachingGains.impact > 0) {
- optimizations.push(cachingGains);
- }
- // Calculate performance gains
- const totalTimeSavings = optimizations.reduce((sum, opt) => sum + opt.impact, 0);
- const originalTime = plan.totalEstimatedTime;
- const optimizedTime = Math.max(originalTime - totalTimeSavings, originalTime * 0.3); // Don't optimize beyond 70% improvement
- const performanceGains = {
- originalEstimatedTime: originalTime,
- optimizedEstimatedTime: optimizedTime,
- timeSavings: totalTimeSavings,
- parallelizationGains: parallelizationGains.impact
- };
- const optimizedPlan = {
- ...plan,
- totalEstimatedTime: optimizedTime,
- parallelStages: optimizedStages,
- optimizations,
- performanceGains
- };
- const processingTime = perf_hooks_1.performance.now() - startTime;
- logger_1.logger.info('Execution plan optimized', {
- processingTime: `${processingTime.toFixed(2)}ms`,
- originalTime: `${originalTime}ms`,
- optimizedTime: `${optimizedTime}ms`,
- timeSavings: `${totalTimeSavings}ms`,
- optimizationCount: optimizations.length
- });
- return optimizedPlan;
- }
- catch (error) {
- const errorMessage = error instanceof Error ? error.message : String(error);
- logger_1.logger.error('Failed to optimize execution plan', {
- error: errorMessage
- });
- // Return original plan if optimization fails
- return {
- ...plan,
- optimizations: [],
- performanceGains: {
- originalEstimatedTime: plan.totalEstimatedTime,
- optimizedEstimatedTime: plan.totalEstimatedTime,
- timeSavings: 0,
- parallelizationGains: 0
- }
- };
- }
- }
- /**
- * Get performance statistics
- */
- getPerformanceStats() {
- if (this.performanceMetrics.length === 0) {
- return { average: 0, p95: 0, p99: 0, count: 0 };
- }
- const sorted = [...this.performanceMetrics].sort((a, b) => a - b);
- const average = this.performanceMetrics.reduce((sum, time) => sum + time, 0) / this.performanceMetrics.length;
- const p95 = sorted[Math.floor(sorted.length * 0.95)] ?? 0;
- const p99 = sorted[Math.floor(sorted.length * 0.99)] ?? 0;
- return {
- average: Math.round(average * 100) / 100,
- p95: Math.round(p95 * 100) / 100,
- p99: Math.round(p99 * 100) / 100,
- count: this.performanceMetrics.length
- };
- }
- analyzeExplicitDependencies(actions, graph) {
- for (const action of actions) {
- if (action.dependencies && action.dependencies.length > 0) {
- const node = graph.nodes.get(action.id);
- if (node) {
- for (const depId of action.dependencies) {
- const depNode = graph.nodes.get(depId);
- if (depNode) {
- node.dependsOn.add(depId);
- depNode.dependents.add(action.id);
- graph.edges.add(`${depId}->${action.id}`);
- }
- }
- }
- }
- }
- }
- async analyzeImplicitDependencies(actions, graph) {
- // Analyze action types and parameters to infer dependencies
- const actionsByType = new Map();
- for (const action of actions) {
- if (!actionsByType.has(action.type)) {
- actionsByType.set(action.type, []);
- }
- actionsByType.get(action.type)?.push(action);
- }
- // Common dependency patterns
- const dependencyRules = [
- // Create before assign/update
- { prerequisite: 'create_task', dependent: 'assign_task' },
- { prerequisite: 'create_channel', dependent: 'send_message' },
- { prerequisite: 'create_task', dependent: 'update_task' },
- // User operations must come after user-related creates
- { prerequisite: 'invite_user', dependent: 'assign_task' },
- { prerequisite: 'invite_user', dependent: 'add_to_channel' },
- // File operations
- { prerequisite: 'upload_file', dependent: 'share_file' },
- { prerequisite: 'create_task', dependent: 'attach_file' },
- // Notification dependencies
- { prerequisite: 'create_task', dependent: 'send_notification' },
- { prerequisite: 'assign_task', dependent: 'send_notification' }
- ];
- // Apply dependency rules
- for (const rule of dependencyRules) {
- const prerequisites = actionsByType.get(rule.prerequisite) || [];
- const dependents = actionsByType.get(rule.dependent) || [];
- for (const prereq of prerequisites) {
- for (const dependent of dependents) {
- if (this.shouldCreateImplicitDependency(prereq, dependent)) {
- const prereqNode = graph.nodes.get(prereq.id);
- const depNode = graph.nodes.get(dependent.id);
- if (prereqNode && depNode) {
- depNode.dependsOn.add(prereq.id);
- prereqNode.dependents.add(dependent.id);
- graph.edges.add(`${prereq.id}->${dependent.id}`);
- }
- }
- }
- }
- }
- }
- shouldCreateImplicitDependency(prereq, dependent) {
- // Check if actions operate on the same entity
- if (prereq.parameters?.entityId && dependent.parameters?.entityId) {
- return prereq.parameters.entityId === dependent.parameters.entityId;
- }
- // Check if dependent action needs output from prerequisite
- if (prereq.metadata?.producesOutput && dependent.metadata?.requiresInput) {
- return true;
- }
- // Default to no dependency
- return false;
- }
- calculateDependencyLevels(graph) {
- const visited = new Set();
- const visiting = new Set();
- const calculateLevel = (nodeId) => {
- if (visiting.has(nodeId)) {
- throw new Error(`Circular dependency detected: ${nodeId}`);
- }
- if (visited.has(nodeId)) {
- return graph.nodes.get(nodeId)?.level || 0;
- }
- visiting.add(nodeId);
- const node = graph.nodes.get(nodeId);
- if (!node) {
- return 0;
- }
- let maxDepLevel = -1;
- for (const depId of node.dependsOn) {
- maxDepLevel = Math.max(maxDepLevel, calculateLevel(depId));
- }
- node.level = maxDepLevel + 1;
- visited.add(nodeId);
- visiting.delete(nodeId);
- return node.level;
- };
- // Calculate levels for all nodes
- for (const nodeId of graph.nodes.keys()) {
- calculateLevel(nodeId);
- }
- }
- detectCircularDependencies(graph) {
- const visited = new Set();
- const recursionStack = new Set();
- const hasCycle = (nodeId) => {
- if (recursionStack.has(nodeId)) {
- return true;
- }
- if (visited.has(nodeId)) {
- return false;
- }
- visited.add(nodeId);
- recursionStack.add(nodeId);
- const node = graph.nodes.get(nodeId);
- if (node) {
- for (const depId of node.dependsOn) {
- if (hasCycle(depId)) {
- return true;
- }
- }
- }
- recursionStack.delete(nodeId);
- return false;
- };
- for (const nodeId of graph.nodes.keys()) {
- if (hasCycle(nodeId)) {
- throw new types_1.AIProcessingError(`Circular dependency detected involving: ${nodeId}`);
- }
- }
- }
- createExecutionLevels(graph) {
- const levelMap = new Map();
- // Group actions by level
- for (const node of graph.nodes.values()) {
- if (!levelMap.has(node.level)) {
- levelMap.set(node.level, []);
- }
- levelMap.get(node.level)?.push(node.action);
- }
- // Create dependency levels
- graph.levels = [];
- for (const [level, actions] of levelMap.entries()) {
- const estimatedDuration = actions.reduce((sum, action) => sum + (action.metadata?.estimatedDuration || 1000), 0);
- const parallelizable = actions.length > 1 &&
- actions.every(action => !action.metadata?.requiresInput);
- graph.levels.push({
- level,
- actions,
- parallelizable,
- estimatedDuration: parallelizable ?
- Math.max(...actions.map(a => a.metadata?.estimatedDuration || 1000)) :
- estimatedDuration
- });
- }
- // Sort levels by level number
- graph.levels.sort((a, b) => a.level - b.level);
- }
- getStagePrerequisites(level, graph) {
- const prerequisites = new Set();
- for (const action of level.actions) {
- const node = graph.nodes.get(action.id);
- if (node) {
- for (const depId of node.dependsOn) {
- prerequisites.add(depId);
- }
- }
- }
- return Array.from(prerequisites);
- }
- assessExecutionRisks(stages, graph) {
- const potentialIssues = [];
- const mitigations = [];
- const failureRecovery = [];
- let riskLevel = 'low';
- // Assess complexity risks
- if (stages.length > 5) {
- potentialIssues.push('Complex multi-stage execution with many dependencies');
- mitigations.push('Implement comprehensive progress tracking and rollback capabilities');
- riskLevel = 'medium';
- }
- // Assess parallel execution risks
- const parallelStages = stages.filter(s => s.parallelExecution);
- if (parallelStages.length > 2) {
- potentialIssues.push('Multiple parallel execution stages increase failure probability');
- mitigations.push('Implement stage-level transaction management');
- riskLevel = 'medium';
- }
- // Assess external dependency risks
- const hasExternalDependencies = Array.from(graph.nodes.values())
- .some(node => node.action.type.includes('external') || node.action.type.includes('api'));
- if (hasExternalDependencies) {
- potentialIssues.push('External API dependencies may cause failures');
- mitigations.push('Implement retry mechanisms and fallback strategies');
- if (riskLevel === 'low')
- riskLevel = 'medium';
- }
- // General failure recovery strategies
- failureRecovery.push('Database transaction rollback for data consistency');
- failureRecovery.push('Detailed error reporting for manual intervention');
- failureRecovery.push('Automatic retry for transient failures');
- failureRecovery.push('User notification of partial completion status');
- return {
- riskLevel,
- potentialIssues,
- mitigations,
- failureRecovery
- };
- }
- optimizeParallelization(stages) {
- let impact = 0;
- const appliedTo = [];
- for (const stage of stages) {
- if (!stage.parallelExecution && stage.actions.length > 1) {
- // Check if actions can be parallelized
- const canParallelize = stage.actions.every(action => !action.metadata?.requiresInput &&
- !stage.actions.some(other => other.id !== action.id &&
- other.dependencies?.includes(action.id)));
- if (canParallelize) {
- const originalDuration = stage.estimatedDuration;
- const parallelDuration = Math.max(...stage.actions.map(a => a.metadata?.estimatedDuration || 1000));
- impact += originalDuration - parallelDuration;
- appliedTo.push(stage.stageId);
- // Update stage
- stage.parallelExecution = true;
- stage.estimatedDuration = parallelDuration;
- }
- }
- }
- return {
- type: 'parallelization',
- description: `Enabled parallel execution for ${appliedTo.length} stages`,
- impact,
- appliedTo
- };
- }
- optimizeActionOrdering(stages) {
- let impact = 0;
- const appliedTo = [];
- for (const stage of stages) {
- if (stage.actions.length > 2 && !stage.parallelExecution) {
- // Sort by estimated duration (shortest first for better perceived performance)
- const originalOrder = [...stage.actions];
- stage.actions.sort((a, b) => {
- const durationA = a.metadata?.estimatedDuration || 1000;
- const durationB = b.metadata?.estimatedDuration || 1000;
- return durationA - durationB;
- });
- // Estimate impact (faster feedback to user)
- const hasOrderChange = originalOrder.some((action, index) => action.id !== (stage.actions[index]?.id || ''));
- if (hasOrderChange) {
- impact += 200; // Estimated user experience improvement
- appliedTo.push(stage.stageId);
- }
- }
- }
- return {
- type: 'reordering',
- description: `Optimized action ordering for ${appliedTo.length} stages`,
- impact,
- appliedTo
- };
- }
- optimizeBatching(stages) {
- let impact = 0;
- const appliedTo = [];
- for (const stage of stages) {
- // Group similar actions that can be batched
- const actionGroups = new Map();
- for (const action of stage.actions) {
- if (!actionGroups.has(action.type)) {
- actionGroups.set(action.type, []);
- }
- actionGroups.get(action.type)?.push(action);
- }
- // Find batchable groups
- for (const [type, actions] of actionGroups.entries()) {
- if (actions.length > 1 && this.isBatchableActionType(type)) {
- const originalTime = actions.reduce((sum, a) => sum + (a.metadata?.estimatedDuration || 1000), 0);
- const batchTime = Math.max(actions.length * 100, 500); // Batch overhead
- if (batchTime < originalTime) {
- impact += originalTime - batchTime;
- appliedTo.push(stage.stageId);
- }
- }
- }
- }
- return {
- type: 'batching',
- description: `Applied batching optimizations to ${appliedTo.length} stages`,
- impact,
- appliedTo
- };
- }
- optimizeCaching(stages) {
- let impact = 0;
- const appliedTo = [];
- // Look for repeated operations that can be cached
- const operationCounts = new Map();
- for (const stage of stages) {
- for (const action of stage.actions) {
- const key = `${action.type}:${JSON.stringify(action.parameters)}`;
- operationCounts.set(key, (operationCounts.get(key) || 0) + 1);
- }
- }
- // Calculate caching benefits for repeated operations
- for (const [operation, count] of operationCounts.entries()) {
- if (count > 1) {
- const estimatedSavings = (count - 1) * 200; // Cache hit savings
- impact += estimatedSavings;
- appliedTo.push(operation);
- }
- }
- return {
- type: 'caching',
- description: `Identified ${appliedTo.length} cacheable operations`,
- impact,
- appliedTo
- };
- }
- isBatchableActionType(actionType) {
- const batchableTypes = [
- 'send_notification',
- 'assign_task',
- 'update_task',
- 'create_task',
- 'send_message'
- ];
- return batchableTypes.includes(actionType);
- }
- recordPerformance(time) {
- this.performanceMetrics.push(time);
- // Keep only last 1000 measurements
- if (this.performanceMetrics.length > 1000) {
- this.performanceMetrics.shift();
- }
- }
-}
-exports.DependencyResolver = DependencyResolver;
-//# sourceMappingURL=DependencyResolver.js.map
\ No newline at end of file
diff --git a/backend/dist/ai/execution/DependencyResolver.js.map b/backend/dist/ai/execution/DependencyResolver.js.map
deleted file mode 100644
index b3b286b..0000000
--- a/backend/dist/ai/execution/DependencyResolver.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"DependencyResolver.js","sourceRoot":"","sources":["../../../src/ai/execution/DependencyResolver.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/ai/execution/MultiActionExecutor.d.ts b/backend/dist/ai/execution/MultiActionExecutor.d.ts
deleted file mode 100644
index f6b6b13..0000000
--- a/backend/dist/ai/execution/MultiActionExecutor.d.ts
+++ /dev/null
@@ -1,127 +0,0 @@
-/**
- * Multi-Action Executor - Phase 2 Complex Command Execution
- * Executes complex voice commands with multiple actions, dependencies, and transactions
- *
- * Success Criteria:
- * - Supports all 10 action types from command parsing
- * - ACID transaction compliance for multi-action commands
- * - Automatic rollback on any action failure
- * - Permission validation per action with detailed audit logging
- * - Transaction timeout handling (30 seconds maximum)
- */
-import { EventEmitter } from 'events';
-import { UserContext, ParsedCommand, ExecutionSummary, AuditEntry } from '../../voice/types';
-export interface MultiActionExecutionOptions {
- transactionTimeout?: number;
- parallelExecutionLimit?: number;
- rollbackOnAnyFailure?: boolean;
- auditLogging?: boolean;
- progressTracking?: boolean;
-}
-export interface ExecutionContext {
- userId: string;
- organizationId: string;
- sessionId: string;
- commandId: string;
- timestamp: string;
- permissions: UserPermissions;
- transaction?: any;
-}
-export interface UserPermissions {
- canCreateTasks: boolean;
- canAssignTasks: boolean;
- canCreateChannels: boolean;
- canInviteUsers: boolean;
- canUploadFiles: boolean;
- canSendMessages: boolean;
- canUpdateTasks: boolean;
- canDeleteTasks: boolean;
- canManageChannels: boolean;
- canSendNotifications: boolean;
-}
-export interface ActionExecutionResult {
- actionId: string;
- actionType: string;
- success: boolean;
- result?: any;
- error?: string;
- executionTime: number;
- affectedEntities: string[];
- rollbackData?: any;
-}
-export interface MultiActionResult {
- commandId: string;
- success: boolean;
- executedActions: ActionExecutionResult[];
- failedActions: ActionExecutionResult[];
- totalExecutionTime: number;
- rollbackRequired: boolean;
- rollbackCompleted: boolean;
- summary: ExecutionSummary;
- auditEntry: AuditEntry;
-}
-export interface TransactionManager {
- transaction: any;
- startTime: number;
- timeout: NodeJS.Timeout;
- isActive: boolean;
- rollbackData: Map;
-}
-export declare class MultiActionExecutor extends EventEmitter {
- private dependencyResolver;
- private db;
- private repositories;
- private voiceFileUploadService;
- private activeTransactions;
- private performanceMetrics;
- constructor();
- /**
- * Execute a complex multi-action voice command
- * Main entry point for command execution with full dependency resolution and transaction management
- */
- executeMultiActionCommand(command: ParsedCommand, userContext: UserContext, options?: MultiActionExecutionOptions): Promise;
- /**
- * Execute a single stage of the execution plan
- */
- private executeStage;
- /**
- * Execute a single action
- */
- private executeAction;
- private executeCreateTask;
- private executeAssignTask;
- private executeUpdateTask;
- private executeCreateChannel;
- private executeSendMessage;
- private executeInviteUser;
- private executeUploadFile;
- private executeSendNotification;
- private executeScheduleMeeting;
- private executeGenerateReport;
- private validateActionPermissions;
- private getUserPermissions;
- private beginTransaction;
- private commitTransaction;
- private rollbackTransaction;
- private handleTransactionTimeout;
- private cleanupStaleTransactions;
- private convertParsedActionsToActions;
- private getEstimatedDuration;
- private actionRequiresInput;
- private actionProducesOutput;
- private createExecutionSummary;
- private createActionBreakdown;
- private createAuditEntry;
- private logAuditEntry;
- /**
- * Get performance statistics
- */
- getPerformanceStats(): {
- average: number;
- p95: number;
- p99: number;
- count: number;
- };
- private recordPerformance;
-}
-//# sourceMappingURL=MultiActionExecutor.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/ai/execution/MultiActionExecutor.d.ts.map b/backend/dist/ai/execution/MultiActionExecutor.d.ts.map
deleted file mode 100644
index 6555d43..0000000
--- a/backend/dist/ai/execution/MultiActionExecutor.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"MultiActionExecutor.d.ts","sourceRoot":"","sources":["../../../src/ai/execution/MultiActionExecutor.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/ai/execution/MultiActionExecutor.js b/backend/dist/ai/execution/MultiActionExecutor.js
deleted file mode 100644
index b551d32..0000000
--- a/backend/dist/ai/execution/MultiActionExecutor.js
+++ /dev/null
@@ -1,858 +0,0 @@
-"use strict";
-/**
- * Multi-Action Executor - Phase 2 Complex Command Execution
- * Executes complex voice commands with multiple actions, dependencies, and transactions
- *
- * Success Criteria:
- * - Supports all 10 action types from command parsing
- * - ACID transaction compliance for multi-action commands
- * - Automatic rollback on any action failure
- * - Permission validation per action with detailed audit logging
- * - Transaction timeout handling (30 seconds maximum)
- */
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.MultiActionExecutor = void 0;
-const events_1 = require("events");
-const perf_hooks_1 = require("perf_hooks");
-const logger_1 = require("../../utils/logger");
-const db_1 = require("../../db");
-const VoiceFileUploadService_1 = require("../../files/upload/VoiceFileUploadService");
-const types_1 = require("../../voice/types");
-const DependencyResolver_1 = require("./DependencyResolver");
-class MultiActionExecutor extends events_1.EventEmitter {
- dependencyResolver;
- db;
- repositories;
- voiceFileUploadService;
- activeTransactions = new Map();
- performanceMetrics = [];
- constructor() {
- super();
- this.dependencyResolver = new DependencyResolver_1.DependencyResolver();
- this.db = new db_1.DatabaseManager();
- this.repositories = db_1.repositories;
- this.voiceFileUploadService = new VoiceFileUploadService_1.VoiceFileUploadService();
- // Setup cleanup interval for stale transactions
- setInterval(() => this.cleanupStaleTransactions(), 60000); // Every minute
- logger_1.logger.info('Multi-Action Executor initialized');
- }
- /**
- * Execute a complex multi-action voice command
- * Main entry point for command execution with full dependency resolution and transaction management
- */
- async executeMultiActionCommand(command, userContext, options = {}) {
- const startTime = perf_hooks_1.performance.now();
- const executionId = `exec-${Date.now()}-${Math.random().toString(36).substring(7)}`;
- const executionContext = {
- userId: userContext.userId,
- organizationId: userContext.organizationId,
- sessionId: userContext.sessionId || 'default',
- commandId: command.id,
- timestamp: new Date().toISOString(),
- permissions: await this.getUserPermissions(userContext.userId),
- };
- const executionOptions = {
- transactionTimeout: 30000, // 30 seconds
- parallelExecutionLimit: 3,
- rollbackOnAnyFailure: true,
- auditLogging: true,
- progressTracking: true,
- ...options,
- };
- logger_1.logger.info('Starting multi-action command execution', {
- executionId,
- commandId: command.id,
- actionCount: command.actions.length,
- userId: userContext.userId,
- options: executionOptions,
- });
- let transactionManager;
- const executedActions = [];
- const failedActions = [];
- let rollbackCompleted = false;
- try {
- // Step 1: Convert parsed command actions to dependency actions
- const actions = this.convertParsedActionsToActions(command.actions);
- // Step 2: Analyze dependencies and create execution plan
- this.emit('dependency_analysis_start', { executionId, actionCount: actions.length });
- const dependencyGraph = await this.dependencyResolver.analyzeDependencies(actions);
- const executionPlan = await this.dependencyResolver.createExecutionPlan(dependencyGraph);
- const optimizedPlan = await this.dependencyResolver.optimizeExecutionOrder(executionPlan);
- this.emit('execution_plan_ready', {
- executionId,
- stageCount: optimizedPlan.parallelStages.length,
- estimatedTime: optimizedPlan.totalEstimatedTime,
- optimizations: optimizedPlan.optimizations.length,
- });
- // Step 3: Start database transaction
- transactionManager = await this.beginTransaction(executionId, executionOptions.transactionTimeout);
- executionContext.transaction = transactionManager.transaction;
- // Step 4: Execute plan stages
- for (let i = 0; i < optimizedPlan.parallelStages.length; i++) {
- const stage = optimizedPlan.parallelStages[i];
- this.emit('stage_execution_start', {
- executionId,
- stageId: stage?.stageId ?? 'unknown',
- actionCount: stage?.actions?.length ?? 0,
- parallelExecution: stage?.parallelExecution ?? false,
- });
- if (stage) {
- const stageResults = await this.executeStage(stage, executionContext, executionOptions);
- // Process results
- for (const result of stageResults) {
- if (result.success) {
- executedActions.push(result);
- }
- else {
- failedActions.push(result);
- if (executionOptions.rollbackOnAnyFailure) {
- throw new types_1.AIProcessingError(`Action failed: ${result.actionType} - ${result.error}`);
- }
- }
- }
- this.emit('stage_execution_complete', {
- executionId,
- stageId: stage.stageId,
- successCount: stageResults.filter((r) => r.success).length,
- failureCount: stageResults.filter((r) => !r.success).length,
- });
- }
- else {
- logger_1.logger.warn('Skipped undefined stage during execution', { executionId, stageIndex: i });
- }
- }
- // Step 5: Commit transaction
- await this.commitTransaction(transactionManager);
- const totalExecutionTime = perf_hooks_1.performance.now() - startTime;
- this.recordPerformance(totalExecutionTime);
- // Step 6: Create execution summary and audit entry
- const summary = this.createExecutionSummary(executedActions, failedActions, totalExecutionTime);
- const auditEntry = this.createAuditEntry(command, executionContext, summary);
- // Log audit entry if enabled
- if (executionOptions.auditLogging) {
- await this.logAuditEntry(auditEntry);
- }
- const result = {
- commandId: command.id,
- success: failedActions.length === 0,
- executedActions,
- failedActions,
- totalExecutionTime,
- rollbackRequired: false,
- rollbackCompleted: false,
- summary,
- auditEntry,
- };
- this.emit('execution_complete', {
- executionId,
- success: result.success,
- totalTime: totalExecutionTime,
- actionCount: executedActions.length,
- });
- logger_1.logger.info('Multi-action command execution completed successfully', {
- executionId,
- commandId: command.id,
- totalTime: `${totalExecutionTime.toFixed(2)}ms`,
- successfulActions: executedActions.length,
- failedActions: failedActions.length,
- });
- return result;
- }
- catch (error) {
- const totalExecutionTime = perf_hooks_1.performance.now() - startTime;
- this.recordPerformance(totalExecutionTime);
- logger_1.logger.error('Multi-action command execution failed', {
- executionId,
- commandId: command.id,
- error: error instanceof Error ? error.message : String(error),
- totalTime: `${totalExecutionTime.toFixed(2)}ms`,
- executedActions: executedActions.length,
- });
- // Attempt rollback
- let rollbackSuccess = false;
- if (transactionManager) {
- try {
- rollbackSuccess = await this.rollbackTransaction(transactionManager, executedActions);
- rollbackCompleted = true;
- }
- catch (rollbackError) {
- const rollbackErrorMessage = rollbackError instanceof Error ? rollbackError.message : String(rollbackError);
- logger_1.logger.error('Transaction rollback failed', {
- executionId,
- rollbackError: rollbackErrorMessage,
- });
- }
- }
- const summary = this.createExecutionSummary(executedActions, failedActions, totalExecutionTime);
- const errorMessage = error instanceof Error ? error.message : String(error);
- const auditEntry = this.createAuditEntry(command, executionContext, summary, errorMessage);
- // Log audit entry even for failures
- if (executionOptions.auditLogging) {
- await this.logAuditEntry(auditEntry);
- }
- this.emit('execution_failed', {
- executionId,
- error: errorMessage,
- rollbackCompleted: rollbackSuccess,
- });
- return {
- commandId: command.id,
- success: false,
- executedActions,
- failedActions,
- totalExecutionTime,
- rollbackRequired: true,
- rollbackCompleted: rollbackSuccess,
- summary,
- auditEntry,
- };
- }
- finally {
- // Cleanup transaction
- if (transactionManager) {
- this.activeTransactions.delete(executionId);
- if (transactionManager.timeout) {
- clearTimeout(transactionManager.timeout);
- }
- }
- }
- }
- /**
- * Execute a single stage of the execution plan
- */
- async executeStage(stage, context, options) {
- const results = [];
- if (stage.parallelExecution && stage.actions.length > 1) {
- // Execute actions in parallel
- const parallelLimit = Math.min(stage.actions.length, options.parallelExecutionLimit || 3);
- const chunks = [];
- // Split actions into chunks for parallel execution
- for (let i = 0; i < stage.actions.length; i += parallelLimit) {
- chunks.push(stage.actions.slice(i, i + parallelLimit));
- }
- for (const chunk of chunks) {
- const chunkResults = await Promise.all(chunk.map((action) => this.executeAction(action, context)));
- results.push(...chunkResults);
- }
- }
- else {
- // Execute actions sequentially
- for (const action of stage.actions) {
- const result = await this.executeAction(action, context);
- results.push(result);
- // Stop on first failure if configured
- if (!result.success && options.rollbackOnAnyFailure) {
- break;
- }
- }
- }
- return results;
- }
- /**
- * Execute a single action
- */
- async executeAction(action, context) {
- const startTime = perf_hooks_1.performance.now();
- try {
- // Validate permissions
- if (!this.validateActionPermissions(action, context.permissions)) {
- throw new Error(`Insufficient permissions for action: ${action.type}`);
- }
- // Execute the action based on type
- let result;
- const affectedEntities = [];
- let rollbackData = null;
- switch (action.type) {
- case 'create_task':
- result = await this.executeCreateTask(action, context);
- affectedEntities.push(result.id);
- rollbackData = { taskId: result.id };
- break;
- case 'assign_task':
- result = await this.executeAssignTask(action, context);
- affectedEntities.push(action.parameters.taskId);
- rollbackData = {
- taskId: action.parameters.taskId,
- previousAssignees: result.previousAssignees,
- };
- break;
- case 'update_task':
- result = await this.executeUpdateTask(action, context);
- affectedEntities.push(action.parameters.taskId);
- rollbackData = {
- taskId: action.parameters.taskId,
- previousValues: result.previousValues,
- };
- break;
- case 'create_channel':
- result = await this.executeCreateChannel(action, context);
- affectedEntities.push(result.id);
- rollbackData = { channelId: result.id };
- break;
- case 'send_message':
- result = await this.executeSendMessage(action, context);
- affectedEntities.push(action.parameters.channelId);
- rollbackData = { messageId: result.id };
- break;
- case 'invite_user':
- result = await this.executeInviteUser(action, context);
- affectedEntities.push(result.userId);
- rollbackData = { invitationId: result.id };
- break;
- case 'upload_file':
- result = await this.executeUploadFile(action, context);
- affectedEntities.push(result.fileId);
- rollbackData = { fileId: result.fileId };
- break;
- case 'send_notification':
- result = await this.executeSendNotification(action, context);
- affectedEntities.push(...(action.parameters.userIds || []));
- rollbackData = { notificationId: result.id };
- break;
- case 'schedule_meeting':
- result = await this.executeScheduleMeeting(action, context);
- affectedEntities.push(result.meetingId);
- rollbackData = { meetingId: result.meetingId };
- break;
- case 'generate_report':
- result = await this.executeGenerateReport(action, context);
- affectedEntities.push(result.reportId);
- rollbackData = { reportId: result.reportId };
- break;
- default:
- throw new Error(`Unsupported action type: ${action.type}`);
- }
- const executionTime = perf_hooks_1.performance.now() - startTime;
- return {
- actionId: action.id,
- actionType: action.type,
- success: true,
- result,
- executionTime,
- affectedEntities,
- rollbackData,
- };
- }
- catch (error) {
- const executionTime = perf_hooks_1.performance.now() - startTime;
- const errorMessage = error instanceof Error ? error.message : String(error);
- return {
- actionId: action.id,
- actionType: action.type,
- success: false,
- error: errorMessage,
- executionTime,
- affectedEntities: [],
- };
- }
- }
- // Action execution implementations
- async executeCreateTask(action, context) {
- const { title, description, priority, dueDate, assignedTo } = action.parameters;
- const task = await this.repositories.tasks.query(`
- INSERT INTO tasks (title, description, priority, due_date, assigned_to, created_by, status)
- VALUES ($1, $2, $3, $4, $5, $6, 'pending')
- RETURNING id, title, status, created_at
- `, [title, description, priority || 'medium', dueDate, assignedTo || [], context.userId], context.transaction);
- return task.rows[0];
- }
- async executeAssignTask(action, context) {
- const { taskId, assignedTo } = action.parameters;
- // Get current assignees for rollback
- const currentTask = await this.db.query(`
- SELECT assigned_to FROM tasks WHERE id = $1
- `, [taskId], context.transaction);
- const previousAssignees = currentTask.rows[0]?.assigned_to || [];
- const result = await this.db.query(`
- UPDATE tasks
- SET assigned_to = $2, updated_at = NOW()
- WHERE id = $1
- RETURNING id, assigned_to
- `, [taskId, assignedTo], context.transaction);
- return {
- taskId,
- assignedTo,
- previousAssignees,
- updated: result.rowCount > 0,
- };
- }
- async executeUpdateTask(action, context) {
- const { taskId, updates } = action.parameters;
- // Get current values for rollback
- const currentTask = await this.db.query(`
- SELECT title, description, status, priority, due_date
- FROM tasks WHERE id = $1
- `, [taskId], context.transaction);
- const previousValues = currentTask.rows[0] || {};
- // Build dynamic update query
- const updateFields = [];
- const updateValues = [taskId];
- let paramIndex = 2;
- for (const [field, value] of Object.entries(updates)) {
- if (['title', 'description', 'status', 'priority', 'due_date'].includes(field)) {
- updateFields.push(`${field} = $${paramIndex}`);
- updateValues.push(value);
- paramIndex++;
- }
- }
- updateFields.push(`updated_at = NOW()`);
- const result = await this.db.query(`
- UPDATE tasks
- SET ${updateFields.join(', ')}
- WHERE id = $1
- RETURNING id, title, status, updated_at
- `, updateValues, context.transaction);
- return {
- taskId,
- updates: result.rows[0],
- previousValues,
- };
- }
- async executeCreateChannel(action, context) {
- const { name, description, channelType, members } = action.parameters;
- // Create channel
- const channel = await this.db.query(`
- INSERT INTO channels (name, description, channel_type, created_by, status)
- VALUES ($1, $2, $3, $4, 'active')
- RETURNING id, name, channel_type, created_at
- `, [name, description, channelType || 'general', context.userId], context.transaction);
- const channelId = channel.rows[0].id;
- // Add creator as member
- await this.db.query(`
- INSERT INTO channel_members (channel_id, user_id, role, joined_at)
- VALUES ($1, $2, 'admin', NOW())
- `, [channelId, context.userId], context.transaction);
- // Add additional members if specified
- if (members && members.length > 0) {
- for (const memberId of members) {
- await this.db.query(`
- INSERT INTO channel_members (channel_id, user_id, role, joined_at)
- VALUES ($1, $2, 'member', NOW())
- ON CONFLICT (channel_id, user_id) DO NOTHING
- `, [channelId, memberId], context.transaction);
- }
- }
- return channel.rows[0];
- }
- async executeSendMessage(action, context) {
- const { channelId, content, messageType } = action.parameters;
- const message = await this.db.query(`
- INSERT INTO messages (channel_id, user_id, content, message_type, sent_at)
- VALUES ($1, $2, $3, $4, NOW())
- RETURNING id, content, sent_at
- `, [channelId, context.userId, content, messageType || 'text'], context.transaction);
- return message.rows[0];
- }
- async executeInviteUser(action, context) {
- const { email, name, role } = action.parameters;
- const invitation = await this.db.query(`
- INSERT INTO user_invitations (email, name, role, invited_by, organization_id, status)
- VALUES ($1, $2, $3, $4, $5, 'pending')
- RETURNING id, email, created_at
- `, [email, name, role || 'member', context.userId, context.organizationId], context.transaction);
- return {
- id: invitation.rows[0].id,
- userId: email, // Use email as user identifier for now
- status: 'invited',
- };
- }
- async executeUploadFile(action, context) {
- const { fileName, fileSize, contentType, description, targetChannels, targetTasks, tags } = action.parameters;
- // Use the voice file upload service for complete workflow
- const uploadRequest = {
- fileName,
- contentType: contentType || 'application/octet-stream',
- fileSize: fileSize || 1024, // Default 1KB if not specified
- userContext: {
- userId: context.userId,
- organizationId: context.organizationId,
- sessionId: context.sessionId,
- language: 'en',
- timezone: 'UTC',
- },
- description,
- targetChannels: targetChannels || [],
- targetTasks: targetTasks || [],
- tags: tags || [],
- };
- const uploadResult = await this.voiceFileUploadService.initiateVoiceUpload(uploadRequest);
- if (!uploadResult.success) {
- throw new Error(uploadResult.error || 'File upload initiation failed');
- }
- return {
- fileId: uploadResult.fileId,
- uploadUrl: uploadResult.uploadUrl,
- downloadUrl: uploadResult.downloadUrl,
- expiresAt: uploadResult.expiresAt,
- linkedEntities: uploadResult.linkedEntities,
- status: 'upload_initiated',
- };
- }
- async executeSendNotification(action, context) {
- const { userIds, title, message, notificationType } = action.parameters;
- const notification = await this.db.query(`
- INSERT INTO notifications (title, message, notification_type, sender_id, organization_id, created_at)
- VALUES ($1, $2, $3, $4, $5, NOW())
- RETURNING id, title, created_at
- `, [title, message, notificationType || 'info', context.userId, context.organizationId], context.transaction);
- const notificationId = notification.rows[0].id;
- // Send to specified users
- if (userIds && userIds.length > 0) {
- for (const userId of userIds) {
- await this.db.query(`
- INSERT INTO user_notifications (user_id, notification_id, status)
- VALUES ($1, $2, 'unread')
- `, [userId, notificationId], context.transaction);
- }
- }
- return notification.rows[0];
- }
- async executeScheduleMeeting(action, context) {
- const { title, startTime, endTime, attendees, description } = action.parameters;
- // For now, return a mock meeting ID
- // In a real implementation, this would integrate with calendar systems
- return {
- meetingId: `meeting-${Date.now()}`,
- title,
- scheduled: true,
- attendeeCount: attendees?.length || 0,
- };
- }
- async executeGenerateReport(action, context) {
- const { reportType, parameters, format } = action.parameters;
- // For now, return a mock report ID
- // In a real implementation, this would generate actual reports
- return {
- reportId: `report-${Date.now()}`,
- type: reportType,
- status: 'generated',
- format: format || 'pdf',
- };
- }
- validateActionPermissions(action, permissions) {
- const permissionMap = {
- create_task: 'canCreateTasks',
- assign_task: 'canAssignTasks',
- update_task: 'canUpdateTasks',
- create_channel: 'canCreateChannels',
- send_message: 'canSendMessages',
- invite_user: 'canInviteUsers',
- upload_file: 'canUploadFiles',
- send_notification: 'canSendNotifications',
- };
- const requiredPermission = permissionMap[action.type];
- return !requiredPermission || permissions[requiredPermission];
- }
- async getUserPermissions(userId) {
- // Get user role and organization permissions
- const user = await this.db.query(`
- SELECT role FROM users WHERE id = $1
- `, [userId]);
- const userRole = user.rows[0]?.role || 'member';
- // Define permissions based on role
- const rolePermissions = {
- admin: {
- canCreateTasks: true,
- canAssignTasks: true,
- canCreateChannels: true,
- canInviteUsers: true,
- canUploadFiles: true,
- canSendMessages: true,
- canUpdateTasks: true,
- canDeleteTasks: true,
- canManageChannels: true,
- canSendNotifications: true,
- },
- manager: {
- canCreateTasks: true,
- canAssignTasks: true,
- canCreateChannels: true,
- canInviteUsers: false,
- canUploadFiles: true,
- canSendMessages: true,
- canUpdateTasks: true,
- canDeleteTasks: false,
- canManageChannels: false,
- canSendNotifications: true,
- },
- member: {
- canCreateTasks: true,
- canAssignTasks: false,
- canCreateChannels: false,
- canInviteUsers: false,
- canUploadFiles: true,
- canSendMessages: true,
- canUpdateTasks: true,
- canDeleteTasks: false,
- canManageChannels: false,
- canSendNotifications: false,
- },
- };
- const permissions = rolePermissions[userRole];
- if (permissions) {
- return permissions;
- }
- const memberPermissions = rolePermissions.member;
- if (memberPermissions) {
- return memberPermissions;
- }
- // Fallback to minimal permissions if member role isn't defined
- return {
- canCreateTasks: false,
- canAssignTasks: false,
- canCreateChannels: false,
- canInviteUsers: false,
- canUploadFiles: false,
- canSendMessages: false,
- canUpdateTasks: false,
- canDeleteTasks: false,
- canManageChannels: false,
- canSendNotifications: false,
- };
- }
- async beginTransaction(executionId, timeout) {
- const transaction = await this.db.transaction(async (client) => client);
- const timeoutHandler = setTimeout(() => {
- this.handleTransactionTimeout(executionId);
- }, timeout);
- const transactionManager = {
- transaction,
- startTime: Date.now(),
- timeout: timeoutHandler,
- isActive: true,
- rollbackData: new Map(),
- };
- this.activeTransactions.set(executionId, transactionManager);
- logger_1.logger.debug('Transaction started', {
- executionId,
- timeout: `${timeout}ms`,
- });
- return transactionManager;
- }
- async commitTransaction(transactionManager) {
- if (transactionManager.isActive) {
- // For DatabaseManager, commit happens automatically at end of transaction callback
- transactionManager.isActive = false;
- if (transactionManager.timeout) {
- clearTimeout(transactionManager.timeout);
- }
- logger_1.logger.debug('Transaction committed successfully');
- }
- }
- async rollbackTransaction(transactionManager, executedActions) {
- try {
- if (transactionManager.isActive) {
- // For DatabaseManager, rollback happens by throwing error in transaction callback
- transactionManager.isActive = false;
- if (transactionManager.timeout) {
- clearTimeout(transactionManager.timeout);
- }
- logger_1.logger.info('Transaction rolled back successfully', {
- executedActionCount: executedActions.length,
- });
- return true;
- }
- return false;
- }
- catch (error) {
- const errorMessage = error instanceof Error ? error.message : String(error);
- logger_1.logger.error('Transaction rollback failed', {
- error: errorMessage,
- executedActionCount: executedActions.length,
- });
- return false;
- }
- }
- handleTransactionTimeout(executionId) {
- const transactionManager = this.activeTransactions.get(executionId);
- if (transactionManager?.isActive) {
- logger_1.logger.warn('Transaction timeout, forcing rollback', {
- executionId,
- duration: Date.now() - transactionManager.startTime,
- });
- // Force rollback on timeout
- this.rollbackTransaction(transactionManager, []);
- this.activeTransactions.delete(executionId);
- this.emit('transaction_timeout', { executionId });
- }
- }
- cleanupStaleTransactions() {
- const staleTransactions = [];
- for (const [executionId, transactionManager] of this.activeTransactions.entries()) {
- const age = Date.now() - transactionManager.startTime;
- if (age > 60000) {
- // 1 minute
- staleTransactions.push(executionId);
- }
- }
- for (const executionId of staleTransactions) {
- const transactionManager = this.activeTransactions.get(executionId);
- if (transactionManager) {
- this.rollbackTransaction(transactionManager, []);
- this.activeTransactions.delete(executionId);
- }
- }
- if (staleTransactions.length > 0) {
- logger_1.logger.warn('Cleaned up stale transactions', {
- count: staleTransactions.length,
- });
- }
- }
- convertParsedActionsToActions(parsedActions) {
- return parsedActions.map((action, index) => ({
- id: action.id || `action-${index}`,
- type: action.type,
- parameters: action.parameters,
- dependencies: action.dependencies || [],
- metadata: {
- priority: action.priority || 1,
- estimatedDuration: this.getEstimatedDuration(action.type),
- requiresInput: this.actionRequiresInput(action.type),
- producesOutput: this.actionProducesOutput(action.type),
- },
- }));
- }
- getEstimatedDuration(actionType) {
- const durations = {
- create_task: 500,
- assign_task: 300,
- update_task: 400,
- create_channel: 600,
- send_message: 200,
- invite_user: 800,
- upload_file: 2000,
- send_notification: 300,
- schedule_meeting: 1000,
- generate_report: 3000,
- };
- return durations[actionType] || 1000;
- }
- actionRequiresInput(actionType) {
- return ['assign_task', 'update_task', 'send_message'].includes(actionType);
- }
- actionProducesOutput(actionType) {
- return ['create_task', 'create_channel', 'upload_file', 'generate_report'].includes(actionType);
- }
- createExecutionSummary(executed, failed, totalTime) {
- return {
- totalActions: executed.length + failed.length,
- successfulActions: executed.length,
- failedActions: failed.length,
- totalExecutionTime: totalTime,
- averageActionTime: executed.length > 0
- ? executed.reduce((sum, a) => sum + a.executionTime, 0) / executed.length
- : 0,
- affectedEntities: Array.from(new Set(executed.flatMap((a) => a.affectedEntities))),
- actionBreakdown: this.createActionBreakdown(executed, failed),
- };
- }
- createActionBreakdown(executed, failed) {
- const breakdown = {};
- // Process executed actions
- for (const action of executed) {
- if (!breakdown[action.actionType]) {
- breakdown[action.actionType] = { success: 0, failed: 0, times: [] };
- }
- breakdown[action.actionType].success++;
- breakdown[action.actionType].times.push(action.executionTime);
- }
- // Process failed actions
- for (const action of failed) {
- if (!breakdown[action.actionType]) {
- breakdown[action.actionType] = { success: 0, failed: 0, times: [] };
- }
- breakdown[action.actionType].failed++;
- if (action.executionTime) {
- breakdown[action.actionType].times.push(action.executionTime);
- }
- }
- // Calculate averages
- const result = {};
- for (const [type, data] of Object.entries(breakdown)) {
- result[type] = {
- success: data.success,
- failed: data.failed,
- avgTime: data.times.length > 0
- ? data.times.reduce((sum, time) => sum + time, 0) / data.times.length
- : 0,
- };
- }
- return result;
- }
- createAuditEntry(command, context, summary, error) {
- return {
- id: `audit-${Date.now()}`,
- commandId: command.id,
- userId: context.userId,
- organizationId: context.organizationId,
- sessionId: context.sessionId,
- timestamp: context.timestamp,
- originalTranscript: command.originalTranscript,
- parsedIntent: command.intent,
- executionSummary: summary,
- success: summary.failedActions === 0 && !error,
- error: error ?? undefined,
- metadata: {
- userAgent: 'voice-processing-service',
- clientVersion: '2.0.0',
- processingTime: summary.totalExecutionTime,
- },
- };
- }
- async logAuditEntry(auditEntry) {
- try {
- await this.db.query(`
- INSERT INTO audit_log (
- id, command_id, user_id, organization_id, session_id, timestamp,
- original_transcript, parsed_intent, execution_summary, success, error_message
- ) VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11)
- `, [
- auditEntry.id,
- auditEntry.commandId,
- auditEntry.userId,
- auditEntry.organizationId,
- auditEntry.sessionId,
- auditEntry.timestamp,
- auditEntry.originalTranscript,
- auditEntry.parsedIntent,
- JSON.stringify(auditEntry.executionSummary),
- auditEntry.success,
- auditEntry.error,
- ]);
- }
- catch (error) {
- const errorMessage = error instanceof Error ? error.message : String(error);
- logger_1.logger.error('Failed to log audit entry', {
- error: errorMessage,
- auditEntryId: auditEntry.id,
- });
- }
- }
- /**
- * Get performance statistics
- */
- getPerformanceStats() {
- if (this.performanceMetrics.length === 0) {
- return { average: 0, p95: 0, p99: 0, count: 0 };
- }
- const sorted = [...this.performanceMetrics].sort((a, b) => a - b);
- const average = this.performanceMetrics.reduce((sum, time) => sum + time, 0) / this.performanceMetrics.length;
- const p95 = sorted[Math.floor(sorted.length * 0.95)] ?? 0;
- const p99 = sorted[Math.floor(sorted.length * 0.99)] ?? 0;
- return {
- average: Math.round(average * 100) / 100,
- p95: Math.round(p95 * 100) / 100,
- p99: Math.round(p99 * 100) / 100,
- count: this.performanceMetrics.length,
- };
- }
- recordPerformance(time) {
- this.performanceMetrics.push(time);
- // Keep only last 1000 measurements
- if (this.performanceMetrics.length > 1000) {
- this.performanceMetrics.shift();
- }
- }
-}
-exports.MultiActionExecutor = MultiActionExecutor;
-//# sourceMappingURL=MultiActionExecutor.js.map
\ No newline at end of file
diff --git a/backend/dist/ai/execution/MultiActionExecutor.js.map b/backend/dist/ai/execution/MultiActionExecutor.js.map
deleted file mode 100644
index 472e8bb..0000000
--- a/backend/dist/ai/execution/MultiActionExecutor.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"MultiActionExecutor.js","sourceRoot":"","sources":["../../../src/ai/execution/MultiActionExecutor.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/api/index.d.ts b/backend/dist/api/index.d.ts
deleted file mode 100644
index 9252a3f..0000000
--- a/backend/dist/api/index.d.ts
+++ /dev/null
@@ -1,11 +0,0 @@
-/**
- * API Routes Index
- * Centralized registration of all API endpoints
- */
-import { FastifyInstance } from 'fastify';
-/**
- * Register all API routes
- */
-export declare const registerAPIRoutes: (fastify: FastifyInstance) => Promise;
-export default registerAPIRoutes;
-//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/api/index.d.ts.map b/backend/dist/api/index.d.ts.map
deleted file mode 100644
index a28657f..0000000
--- a/backend/dist/api/index.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAW1C;;GAEG;AACH,eAAO,MAAM,iBAAiB,GAAU,SAAS,eAAe,KAAG,OAAO,CAAC,IAAI,CAkB9E,CAAC;AAEF,eAAe,iBAAiB,CAAC"}
\ No newline at end of file
diff --git a/backend/dist/api/index.js b/backend/dist/api/index.js
deleted file mode 100644
index bf9b658..0000000
--- a/backend/dist/api/index.js
+++ /dev/null
@@ -1,41 +0,0 @@
-"use strict";
-/**
- * API Routes Index
- * Centralized registration of all API endpoints
- */
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.registerAPIRoutes = void 0;
-const UserRoutes_1 = require("./routes/UserRoutes");
-const ChannelRoutes_1 = require("./routes/ChannelRoutes");
-const TaskRoutes_1 = require("./routes/TaskRoutes");
-const DocsRoutes_1 = require("./routes/DocsRoutes");
-const MessageRoutes_1 = require("./routes/MessageRoutes");
-const ActivityRoutes_1 = require("./routes/ActivityRoutes");
-const NotificationRoutes_1 = require("./routes/NotificationRoutes");
-const AnnouncementRoutes_1 = require("./routes/AnnouncementRoutes");
-const logger_1 = require("../utils/logger");
-/**
- * Register all API routes
- */
-const registerAPIRoutes = async (fastify) => {
- try {
- // Register route modules
- await fastify.register(UserRoutes_1.registerUserRoutes);
- await fastify.register(ChannelRoutes_1.registerChannelRoutes);
- await fastify.register(TaskRoutes_1.registerTaskRoutes);
- await fastify.register(MessageRoutes_1.registerMessageRoutes);
- await fastify.register(ActivityRoutes_1.registerActivityRoutes);
- await fastify.register(DocsRoutes_1.registerDocsRoutes);
- await fastify.register(NotificationRoutes_1.notificationRoutes);
- await fastify.register(AnnouncementRoutes_1.announcementRoutes);
- logger_1.logger.debug('All API routes registered');
- }
- catch (error) {
- console.error('API Registration Error Details:', error);
- logger_1.logger.error({ error: error instanceof Error ? error.message : String(error) }, 'Failed to register API routes');
- throw error;
- }
-};
-exports.registerAPIRoutes = registerAPIRoutes;
-exports.default = exports.registerAPIRoutes;
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/backend/dist/api/index.js.map b/backend/dist/api/index.js.map
deleted file mode 100644
index a00f75e..0000000
--- a/backend/dist/api/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/api/index.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAGH,oDAAyD;AACzD,0DAA+D;AAC/D,oDAAyD;AACzD,oDAAyD;AACzD,0DAA+D;AAC/D,4DAAiE;AACjE,oEAAiE;AACjE,oEAAiE;AACjE,4CAAyC;AAEzC;;GAEG;AACI,MAAM,iBAAiB,GAAG,KAAK,EAAE,OAAwB,EAAiB,EAAE;IACjF,IAAI,CAAC;QACH,yBAAyB;QACzB,MAAM,OAAO,CAAC,QAAQ,CAAC,+BAAkB,CAAC,CAAC;QAC3C,MAAM,OAAO,CAAC,QAAQ,CAAC,qCAAqB,CAAC,CAAC;QAC9C,MAAM,OAAO,CAAC,QAAQ,CAAC,+BAAkB,CAAC,CAAC;QAC3C,MAAM,OAAO,CAAC,QAAQ,CAAC,qCAAqB,CAAC,CAAC;QAC9C,MAAM,OAAO,CAAC,QAAQ,CAAC,uCAAsB,CAAC,CAAC;QAC/C,MAAM,OAAO,CAAC,QAAQ,CAAC,+BAAkB,CAAC,CAAC;QAC3C,MAAM,OAAO,CAAC,QAAQ,CAAC,uCAAkB,CAAC,CAAC;QAC3C,MAAM,OAAO,CAAC,QAAQ,CAAC,uCAAkB,CAAC,CAAC;QAE3C,eAAM,CAAC,KAAK,CAAC,2BAA2B,CAAC,CAAC;IAC5C,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,CAAC,KAAK,CAAC,iCAAiC,EAAE,KAAK,CAAC,CAAC;QACxD,eAAM,CAAC,KAAK,CAAC,EAAE,KAAK,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,KAAK,CAAC,EAAE,EAAE,+BAA+B,CAAC,CAAC;QACjH,MAAM,KAAK,CAAC;IACd,CAAC;AACH,CAAC,CAAC;AAlBW,QAAA,iBAAiB,qBAkB5B;AAEF,kBAAe,yBAAiB,CAAC"}
\ No newline at end of file
diff --git a/backend/dist/api/routes/ActivityRoutes.d.ts b/backend/dist/api/routes/ActivityRoutes.d.ts
deleted file mode 100644
index 221f051..0000000
--- a/backend/dist/api/routes/ActivityRoutes.d.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { FastifyInstance } from 'fastify';
-/**
- * Activity API Routes
- * Handles activity feed, notifications, and activity logging
- */
-export declare function registerActivityRoutes(fastify: FastifyInstance): Promise;
-//# sourceMappingURL=ActivityRoutes.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/api/routes/ActivityRoutes.d.ts.map b/backend/dist/api/routes/ActivityRoutes.d.ts.map
deleted file mode 100644
index 83ce725..0000000
--- a/backend/dist/api/routes/ActivityRoutes.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ActivityRoutes.d.ts","sourceRoot":"","sources":["../../../src/api/routes/ActivityRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAyBxE;;;GAGG;AACH,wBAAsB,sBAAsB,CAAC,OAAO,EAAE,eAAe,iBAoQpE"}
\ No newline at end of file
diff --git a/backend/dist/api/routes/ActivityRoutes.js b/backend/dist/api/routes/ActivityRoutes.js
deleted file mode 100644
index 38ffd02..0000000
--- a/backend/dist/api/routes/ActivityRoutes.js
+++ /dev/null
@@ -1,231 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.registerActivityRoutes = registerActivityRoutes;
-const ActivityRepository_1 = __importDefault(require("../../db/ActivityRepository"));
-const UserRepository_1 = __importDefault(require("../../db/UserRepository"));
-const middleware_1 = require("../../auth/middleware");
-const logger_1 = require("../../utils/logger");
-/**
- * Activity API Routes
- * Handles activity feed, notifications, and activity logging
- */
-async function registerActivityRoutes(fastify) {
- const activityRepo = new ActivityRepository_1.default();
- const userRepo = new UserRepository_1.default();
- // All routes require authentication
- await fastify.register(async function (fastify) {
- fastify.addHook('onRequest', middleware_1.authenticate);
- /**
- * GET /activities - Get activities with filters and pagination
- */
- fastify.get('/', async (request, reply) => {
- try {
- const { type, channel_id, user_id, limit = 50, offset = 0, from_date, to_date } = request.query;
- // Validate pagination parameters
- if (limit > 100) {
- return reply.code(400).send({
- error: {
- message: 'Limit cannot exceed 100',
- code: 'INVALID_LIMIT',
- }
- });
- }
- // Build filters
- const filters = {};
- if (type)
- filters.type = Array.isArray(type) ? type : [type];
- if (channel_id)
- filters.channel_id = channel_id;
- if (user_id)
- filters.user_id = user_id;
- if (from_date)
- filters.from_date = from_date;
- if (to_date)
- filters.to_date = to_date;
- // Get activities with user information
- const activities = await activityRepo.findMany({
- ...filters,
- limit,
- offset,
- includeUser: true,
- });
- const total = await activityRepo.count(filters);
- const hasMore = offset + limit < total;
- reply.send({
- success: true,
- data: activities,
- pagination: {
- total,
- limit,
- offset,
- hasMore,
- },
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- logger_1.logger.error({ error, userId: request.user?.userId }, 'Error fetching activities');
- reply.code(500).send({
- error: {
- message: 'Failed to fetch activities',
- code: 'ACTIVITY_FETCH_ERROR',
- }
- });
- }
- });
- /**
- * GET /activities/feed - Get personalized activity feed
- */
- fastify.get('/feed', async (request, reply) => {
- try {
- const { limit = 20, offset = 0 } = request.query;
- const userId = request.user.userId;
- // Get activities for channels the user is a member of
- // and activities directly related to the user
- const activities = await activityRepo.getUserFeed(userId, limit, offset);
- const total = await activityRepo.getUserFeedCount(userId);
- const hasMore = offset + limit < total;
- reply.send({
- success: true,
- data: activities,
- pagination: {
- total,
- limit,
- offset,
- hasMore,
- },
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- logger_1.logger.error({ error, userId: request.user?.userId }, 'Error fetching activity feed');
- reply.code(500).send({
- error: {
- message: 'Failed to fetch activity feed',
- code: 'ACTIVITY_FEED_ERROR',
- }
- });
- }
- });
- /**
- * POST /activities - Create new activity
- */
- fastify.post('/', async (request, reply) => {
- try {
- const { type, title, description, metadata = {}, related_id, channel_id } = request.body;
- const userId = request.user.userId;
- // Validate required fields
- if (!type || !title || !description) {
- return reply.code(400).send({
- error: {
- message: 'Type, title, and description are required',
- code: 'MISSING_REQUIRED_FIELDS',
- }
- });
- }
- // Validate activity type
- const validTypes = [
- 'task_created', 'task_updated', 'task_completed', 'task_assigned',
- 'channel_created', 'user_joined', 'file_uploaded', 'message_sent',
- 'announcement', 'notification'
- ];
- if (!validTypes.includes(type)) {
- return reply.code(400).send({
- error: {
- message: `Invalid activity type. Must be one of: ${validTypes.join(', ')}`,
- code: 'INVALID_ACTIVITY_TYPE',
- }
- });
- }
- const activityData = {
- user_id: userId,
- type,
- title,
- description,
- metadata,
- related_id,
- channel_id,
- };
- const activity = await activityRepo.create(activityData);
- reply.code(201).send({
- success: true,
- data: activity,
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- logger_1.logger.error({ error, userId: request.user?.userId }, 'Error creating activity');
- reply.code(500).send({
- error: {
- message: 'Failed to create activity',
- code: 'ACTIVITY_CREATE_ERROR',
- }
- });
- }
- });
- /**
- * GET /activities/stats - Get activity statistics
- */
- fastify.get('/stats', async (request, reply) => {
- try {
- const { period = 'week', channel_id } = request.query;
- const userId = request.user.userId;
- const stats = await activityRepo.getActivityStats({
- userId,
- period,
- channelId: channel_id,
- });
- reply.send({
- success: true,
- data: stats,
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- logger_1.logger.error({ error, userId: request.user?.userId }, 'Error fetching activity stats');
- reply.code(500).send({
- error: {
- message: 'Failed to fetch activity statistics',
- code: 'ACTIVITY_STATS_ERROR',
- }
- });
- }
- });
- /**
- * GET /activities/:id - Get single activity
- */
- fastify.get('/:id', async (request, reply) => {
- try {
- const { id } = request.params;
- const activity = await activityRepo.findById(id);
- if (!activity) {
- return reply.code(404).send({
- error: {
- message: 'Activity not found',
- code: 'ACTIVITY_NOT_FOUND',
- }
- });
- }
- reply.send({
- success: true,
- data: activity,
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- logger_1.logger.error({ error, userId: request.user?.userId }, 'Error fetching activity');
- reply.code(500).send({
- error: {
- message: 'Failed to fetch activity',
- code: 'ACTIVITY_FETCH_ERROR',
- }
- });
- }
- });
- }, { prefix: '/activities' });
- logger_1.logger.debug('Activity routes registered');
-}
-//# sourceMappingURL=ActivityRoutes.js.map
\ No newline at end of file
diff --git a/backend/dist/api/routes/ActivityRoutes.js.map b/backend/dist/api/routes/ActivityRoutes.js.map
deleted file mode 100644
index 463d22d..0000000
--- a/backend/dist/api/routes/ActivityRoutes.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ActivityRoutes.js","sourceRoot":"","sources":["../../../src/api/routes/ActivityRoutes.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/api/routes/AnnouncementRoutes.d.ts b/backend/dist/api/routes/AnnouncementRoutes.d.ts
deleted file mode 100644
index 59f0879..0000000
--- a/backend/dist/api/routes/AnnouncementRoutes.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { FastifyInstance } from 'fastify';
-export declare function announcementRoutes(fastify: FastifyInstance): Promise;
-//# sourceMappingURL=AnnouncementRoutes.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/api/routes/AnnouncementRoutes.d.ts.map b/backend/dist/api/routes/AnnouncementRoutes.d.ts.map
deleted file mode 100644
index 5467eb5..0000000
--- a/backend/dist/api/routes/AnnouncementRoutes.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AnnouncementRoutes.d.ts","sourceRoot":"","sources":["../../../src/api/routes/AnnouncementRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AA0FxE,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,eAAe,iBAslBhE"}
\ No newline at end of file
diff --git a/backend/dist/api/routes/AnnouncementRoutes.js b/backend/dist/api/routes/AnnouncementRoutes.js
deleted file mode 100644
index 9becd23..0000000
--- a/backend/dist/api/routes/AnnouncementRoutes.js
+++ /dev/null
@@ -1,579 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.announcementRoutes = announcementRoutes;
-const typebox_1 = require("@sinclair/typebox");
-const AnnouncementRepository_1 = __importDefault(require("@db/AnnouncementRepository"));
-const logger_1 = require("@utils/logger");
-const errors_1 = require("@utils/errors");
-// Schema definitions
-const AnnouncementTypeSchema = typebox_1.Type.Union([
- typebox_1.Type.Literal('info'),
- typebox_1.Type.Literal('warning'),
- typebox_1.Type.Literal('success'),
- typebox_1.Type.Literal('error'),
- typebox_1.Type.Literal('feature'),
- typebox_1.Type.Literal('maintenance'),
-]);
-const AnnouncementPrioritySchema = typebox_1.Type.Union([
- typebox_1.Type.Literal('low'),
- typebox_1.Type.Literal('medium'),
- typebox_1.Type.Literal('high'),
- typebox_1.Type.Literal('critical'),
-]);
-const AnnouncementAudienceSchema = typebox_1.Type.Union([
- typebox_1.Type.Literal('all'),
- typebox_1.Type.Literal('admins'),
- typebox_1.Type.Literal('developers'),
- typebox_1.Type.Literal('designers'),
- typebox_1.Type.Literal('managers'),
-]);
-const CreateAnnouncementSchema = typebox_1.Type.Object({
- title: typebox_1.Type.String({ minLength: 1, maxLength: 200 }),
- content: typebox_1.Type.String({ minLength: 1, maxLength: 5000 }),
- type: AnnouncementTypeSchema,
- priority: AnnouncementPrioritySchema,
- target_audience: AnnouncementAudienceSchema,
- scheduled_for: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'date-time' })),
- expires_at: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'date-time' })),
- action_button_text: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 50 })),
- action_button_url: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'uri' })),
- image_url: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'uri' })),
- published: typebox_1.Type.Optional(typebox_1.Type.Boolean()),
-});
-const UpdateAnnouncementSchema = typebox_1.Type.Object({
- title: typebox_1.Type.Optional(typebox_1.Type.String({ minLength: 1, maxLength: 200 })),
- content: typebox_1.Type.Optional(typebox_1.Type.String({ minLength: 1, maxLength: 5000 })),
- type: typebox_1.Type.Optional(AnnouncementTypeSchema),
- priority: typebox_1.Type.Optional(AnnouncementPrioritySchema),
- target_audience: typebox_1.Type.Optional(AnnouncementAudienceSchema),
- scheduled_for: typebox_1.Type.Optional(typebox_1.Type.Union([typebox_1.Type.String({ format: 'date-time' }), typebox_1.Type.Null()])),
- expires_at: typebox_1.Type.Optional(typebox_1.Type.Union([typebox_1.Type.String({ format: 'date-time' }), typebox_1.Type.Null()])),
- action_button_text: typebox_1.Type.Optional(typebox_1.Type.Union([typebox_1.Type.String({ maxLength: 50 }), typebox_1.Type.Null()])),
- action_button_url: typebox_1.Type.Optional(typebox_1.Type.Union([typebox_1.Type.String({ format: 'uri' }), typebox_1.Type.Null()])),
- image_url: typebox_1.Type.Optional(typebox_1.Type.Union([typebox_1.Type.String({ format: 'uri' }), typebox_1.Type.Null()])),
- published: typebox_1.Type.Optional(typebox_1.Type.Boolean()),
-});
-const AnnouncementSchema = typebox_1.Type.Object({
- id: typebox_1.Type.String(),
- title: typebox_1.Type.String(),
- content: typebox_1.Type.String(),
- type: AnnouncementTypeSchema,
- priority: AnnouncementPrioritySchema,
- target_audience: AnnouncementAudienceSchema,
- scheduled_for: typebox_1.Type.Union([typebox_1.Type.String({ format: 'date-time' }), typebox_1.Type.Null()]),
- expires_at: typebox_1.Type.Union([typebox_1.Type.String({ format: 'date-time' }), typebox_1.Type.Null()]),
- action_button_text: typebox_1.Type.Union([typebox_1.Type.String(), typebox_1.Type.Null()]),
- action_button_url: typebox_1.Type.Union([typebox_1.Type.String(), typebox_1.Type.Null()]),
- image_url: typebox_1.Type.Union([typebox_1.Type.String(), typebox_1.Type.Null()]),
- created_by: typebox_1.Type.String(),
- published: typebox_1.Type.Boolean(),
- read_by: typebox_1.Type.Array(typebox_1.Type.String()),
- created_at: typebox_1.Type.String({ format: 'date-time' }),
- updated_at: typebox_1.Type.String({ format: 'date-time' }),
- version: typebox_1.Type.Number(),
-});
-async function announcementRoutes(fastify) {
- const announcementRepository = new AnnouncementRepository_1.default();
- /**
- * POST /announcements - Create new announcement (CEO only)
- */
- fastify.post('/announcements', {
- preHandler: [fastify.authenticate],
- schema: {
- tags: ['Announcements'],
- summary: 'Create Announcement',
- description: 'Create a new announcement (CEO only)',
- body: CreateAnnouncementSchema,
- response: {
- 201: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: AnnouncementSchema,
- }),
- 400: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String(),
- }),
- }),
- 401: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String(),
- }),
- }),
- 403: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String(),
- }),
- }),
- },
- },
- }, async (request, reply) => {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.userId,
- email: request.user.email ?? '',
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- try {
- // Only CEO can create announcements
- if (request.user?.role !== 'ceo') {
- throw new errors_1.AuthorizationError('Only CEO users can create announcements');
- }
- const announcementData = {
- title: request.body.title,
- content: request.body.content,
- type: request.body.type,
- priority: request.body.priority,
- target_audience: request.body.target_audience,
- created_by: request.user.userId,
- published: request.body.published,
- ...(request.body.scheduled_for && { scheduled_for: new Date(request.body.scheduled_for) }),
- ...(request.body.expires_at && { expires_at: new Date(request.body.expires_at) }),
- ...(request.body.action_button_text && { action_button_text: request.body.action_button_text }),
- ...(request.body.action_button_url && { action_button_url: request.body.action_button_url }),
- ...(request.body.image_url && { image_url: request.body.image_url }),
- };
- logger_1.loggers.api.info({
- userId: request.user.userId,
- title: announcementData.title,
- type: announcementData.type,
- priority: announcementData.priority,
- targetAudience: announcementData.target_audience,
- published: announcementData.published,
- }, 'Creating announcement');
- const announcement = await announcementRepository.create(announcementData);
- logger_1.loggers.api.info({
- userId: request.user.userId,
- announcementId: announcement.id,
- }, 'Announcement created successfully');
- reply.code(201).send({
- success: true,
- data: announcement,
- });
- }
- catch (error) {
- logger_1.loggers.api.error({ error, context }, 'Failed to create announcement');
- if (error instanceof errors_1.ValidationError) {
- reply.code(400).send((0, errors_1.formatErrorResponse)(error));
- }
- else if (error instanceof errors_1.AuthorizationError) {
- reply.code(403).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send((0, errors_1.formatErrorResponse)(error));
- }
- }
- });
- /**
- * GET /announcements - Get announcements with filters
- */
- fastify.get('/announcements', {
- preHandler: [fastify.authenticate],
- schema: {
- tags: ['Announcements'],
- summary: 'Get Announcements',
- description: 'Get announcements with optional filtering',
- querystring: typebox_1.Type.Object({
- type: typebox_1.Type.Optional(typebox_1.Type.String()),
- priority: typebox_1.Type.Optional(typebox_1.Type.String()),
- target_audience: typebox_1.Type.Optional(typebox_1.Type.String()),
- published: typebox_1.Type.Optional(typebox_1.Type.String()),
- created_by: typebox_1.Type.Optional(typebox_1.Type.String()),
- date_from: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'date-time' })),
- date_to: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'date-time' })),
- limit: typebox_1.Type.Optional(typebox_1.Type.String()),
- offset: typebox_1.Type.Optional(typebox_1.Type.String()),
- user_view: typebox_1.Type.Optional(typebox_1.Type.String()),
- }),
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: typebox_1.Type.Array(AnnouncementSchema),
- total: typebox_1.Type.Number(),
- limit: typebox_1.Type.Number(),
- offset: typebox_1.Type.Number(),
- }),
- },
- },
- }, async (request, reply) => {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.userId,
- email: request.user.email ?? '',
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- try {
- const { type, priority, target_audience, published, created_by, date_from, date_to, limit = '50', offset = '0', user_view = 'false', } = request.query;
- const limitNum = Math.min(parseInt(limit) || 50, 100);
- const offsetNum = parseInt(offset) || 0;
- let data, total;
- if (user_view === 'true') {
- // User-specific view - only show announcements relevant to the user
- data = await announcementRepository.findForUser(request.user.userId, request.user.role, true);
- total = data.length;
- // Apply pagination manually for user view
- data = data.slice(offsetNum, offsetNum + limitNum);
- }
- else {
- // Admin view - show all announcements with filters (CEO only)
- if (request.user?.role !== 'ceo') {
- throw new errors_1.AuthorizationError('Only CEO users can view all announcements');
- }
- const filter = {};
- if (type)
- filter.type = type.split(',');
- if (priority)
- filter.priority = priority.split(',');
- if (target_audience)
- filter.target_audience = target_audience.split(',');
- if (published)
- filter.published = published === 'true';
- if (created_by)
- filter.created_by = created_by.split(',');
- if (date_from)
- filter.date_from = new Date(date_from);
- if (date_to)
- filter.date_to = new Date(date_to);
- const result = await announcementRepository.findWithFilter(filter, limitNum, offsetNum);
- data = result.data;
- total = result.total;
- }
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- userView: user_view === 'true',
- resultsCount: data.length,
- total,
- }, 'Retrieved announcements');
- reply.send({
- success: true,
- data,
- total,
- limit: limitNum,
- offset: offsetNum,
- });
- }
- catch (error) {
- logger_1.loggers.api.error({ error, context }, 'Failed to get announcements');
- if (error instanceof errors_1.AuthorizationError) {
- reply.code(403).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send((0, errors_1.formatErrorResponse)(error));
- }
- }
- });
- /**
- * GET /announcements/:id - Get announcement by ID
- */
- fastify.get('/announcements/:id', {
- preHandler: [fastify.authenticate],
- schema: {
- tags: ['Announcements'],
- summary: 'Get Announcement by ID',
- description: 'Get a specific announcement by ID',
- params: typebox_1.Type.Object({
- id: typebox_1.Type.String(),
- }),
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: AnnouncementSchema,
- }),
- 404: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String(),
- }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const announcement = await announcementRepository.findById(request.params.id);
- if (!announcement) {
- throw new errors_1.NotFoundError(`Announcement with ID ${request.params.id} not found`);
- }
- reply.send({
- success: true,
- data: announcement,
- });
- }
- catch (error) {
- if (error instanceof errors_1.NotFoundError) {
- reply.code(404).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send((0, errors_1.formatErrorResponse)(error));
- }
- }
- });
- /**
- * PUT /announcements/:id - Update announcement (CEO only)
- */
- fastify.put('/announcements/:id', {
- preHandler: [fastify.authenticate],
- schema: {
- tags: ['Announcements'],
- summary: 'Update Announcement',
- description: 'Update an existing announcement (CEO only)',
- params: typebox_1.Type.Object({
- id: typebox_1.Type.String(),
- }),
- body: UpdateAnnouncementSchema,
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: AnnouncementSchema,
- }),
- 400: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String(),
- }),
- }),
- 403: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String(),
- }),
- }),
- 404: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String(),
- }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- // Only CEO can update announcements
- if (request.user?.role !== 'ceo') {
- throw new errors_1.AuthorizationError('Only CEO users can update announcements');
- }
- const updateData = {};
- if (request.body.title !== undefined)
- updateData.title = request.body.title;
- if (request.body.content !== undefined)
- updateData.content = request.body.content;
- if (request.body.type !== undefined)
- updateData.type = request.body.type;
- if (request.body.priority !== undefined)
- updateData.priority = request.body.priority;
- if (request.body.target_audience !== undefined)
- updateData.target_audience = request.body.target_audience;
- if (request.body.published !== undefined)
- updateData.published = request.body.published;
- if (request.body.action_button_text !== undefined)
- updateData.action_button_text = request.body.action_button_text;
- if (request.body.action_button_url !== undefined)
- updateData.action_button_url = request.body.action_button_url;
- if (request.body.image_url !== undefined)
- updateData.image_url = request.body.image_url;
- if (request.body.scheduled_for !== undefined) {
- updateData.scheduled_for = request.body.scheduled_for === null ? null : new Date(request.body.scheduled_for);
- }
- if (request.body.expires_at !== undefined) {
- updateData.expires_at = request.body.expires_at === null ? null : new Date(request.body.expires_at);
- }
- const announcement = await announcementRepository.update(request.params.id, updateData);
- logger_1.loggers.api.info({
- userId: request.user.userId,
- announcementId: announcement.id,
- }, 'Announcement updated successfully');
- reply.send({
- success: true,
- data: announcement,
- });
- }
- catch (error) {
- logger_1.loggers.api.error({ error, announcementId: request.params.id }, 'Failed to update announcement');
- if (error instanceof errors_1.NotFoundError) {
- reply.code(404).send((0, errors_1.formatErrorResponse)(error));
- }
- else if (error instanceof errors_1.ValidationError) {
- reply.code(400).send((0, errors_1.formatErrorResponse)(error));
- }
- else if (error instanceof errors_1.AuthorizationError) {
- reply.code(403).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send((0, errors_1.formatErrorResponse)(error));
- }
- }
- });
- /**
- * DELETE /announcements/:id - Delete announcement (CEO only)
- */
- fastify.delete('/announcements/:id', {
- preHandler: [fastify.authenticate],
- schema: {
- tags: ['Announcements'],
- summary: 'Delete Announcement',
- description: 'Delete an announcement (CEO only)',
- params: typebox_1.Type.Object({
- id: typebox_1.Type.String(),
- }),
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- message: typebox_1.Type.String(),
- }),
- 403: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String(),
- }),
- }),
- 404: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String(),
- }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- // Only CEO can delete announcements
- if (request.user?.role !== 'ceo') {
- throw new errors_1.AuthorizationError('Only CEO users can delete announcements');
- }
- await announcementRepository.softDelete(request.params.id, request.user.userId);
- logger_1.loggers.api.info({
- userId: request.user.userId,
- announcementId: request.params.id,
- }, 'Announcement deleted successfully');
- reply.send({
- success: true,
- message: 'Announcement deleted successfully',
- });
- }
- catch (error) {
- logger_1.loggers.api.error({ error, announcementId: request.params.id }, 'Failed to delete announcement');
- if (error instanceof errors_1.NotFoundError) {
- reply.code(404).send((0, errors_1.formatErrorResponse)(error));
- }
- else if (error instanceof errors_1.AuthorizationError) {
- reply.code(403).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send((0, errors_1.formatErrorResponse)(error));
- }
- }
- });
- /**
- * POST /announcements/:id/read - Mark announcement as read
- */
- fastify.post('/announcements/:id/read', {
- preHandler: [fastify.authenticate],
- schema: {
- tags: ['Announcements'],
- summary: 'Mark Announcement as Read',
- description: 'Mark an announcement as read by the current user',
- params: typebox_1.Type.Object({
- id: typebox_1.Type.String(),
- }),
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- message: typebox_1.Type.String(),
- }),
- 404: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String(),
- }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- await announcementRepository.markAsRead(request.params.id, request.user.userId);
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- announcementId: request.params.id,
- }, 'Announcement marked as read');
- reply.send({
- success: true,
- message: 'Announcement marked as read',
- });
- }
- catch (error) {
- logger_1.loggers.api.error({ error, announcementId: request.params.id }, 'Failed to mark announcement as read');
- reply.code(500).send((0, errors_1.formatErrorResponse)(error));
- }
- });
- /**
- * GET /announcements/stats - Get announcement statistics (CEO only)
- */
- fastify.get('/announcements/stats', {
- preHandler: [fastify.authenticate],
- schema: {
- tags: ['Announcements'],
- summary: 'Get Announcement Statistics',
- description: 'Get announcement statistics (CEO only)',
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: typebox_1.Type.Object({
- total: typebox_1.Type.Number(),
- published: typebox_1.Type.Number(),
- scheduled: typebox_1.Type.Number(),
- expired: typebox_1.Type.Number(),
- byType: typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.Number()),
- byPriority: typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.Number()),
- byAudience: typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.Number()),
- }),
- }),
- 403: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String(),
- }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- // Only CEO can view stats
- if (request.user?.role !== 'ceo') {
- throw new errors_1.AuthorizationError('Only CEO users can view announcement statistics');
- }
- const stats = await announcementRepository.getStats();
- reply.send({
- success: true,
- data: stats,
- });
- }
- catch (error) {
- logger_1.loggers.api.error({ error }, 'Failed to get announcement stats');
- if (error instanceof errors_1.AuthorizationError) {
- reply.code(403).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send((0, errors_1.formatErrorResponse)(error));
- }
- }
- });
-}
-//# sourceMappingURL=AnnouncementRoutes.js.map
\ No newline at end of file
diff --git a/backend/dist/api/routes/AnnouncementRoutes.js.map b/backend/dist/api/routes/AnnouncementRoutes.js.map
deleted file mode 100644
index e755406..0000000
--- a/backend/dist/api/routes/AnnouncementRoutes.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AnnouncementRoutes.js","sourceRoot":"","sources":["../../../src/api/routes/AnnouncementRoutes.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/api/routes/ChannelRoutes.d.ts b/backend/dist/api/routes/ChannelRoutes.d.ts
deleted file mode 100644
index f87efc5..0000000
--- a/backend/dist/api/routes/ChannelRoutes.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { FastifyInstance } from 'fastify';
-/**
- * Register channel routes
- */
-export declare const registerChannelRoutes: (fastify: FastifyInstance) => Promise;
-//# sourceMappingURL=ChannelRoutes.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/api/routes/ChannelRoutes.d.ts.map b/backend/dist/api/routes/ChannelRoutes.d.ts.map
deleted file mode 100644
index 1ad15a1..0000000
--- a/backend/dist/api/routes/ChannelRoutes.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ChannelRoutes.d.ts","sourceRoot":"","sources":["../../../src/api/routes/ChannelRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AA6IxE;;GAEG;AACH,eAAO,MAAM,qBAAqB,GAAU,SAAS,eAAe,kBAwtCnE,CAAC"}
\ No newline at end of file
diff --git a/backend/dist/api/routes/ChannelRoutes.js b/backend/dist/api/routes/ChannelRoutes.js
deleted file mode 100644
index 7ba4229..0000000
--- a/backend/dist/api/routes/ChannelRoutes.js
+++ /dev/null
@@ -1,1200 +0,0 @@
-"use strict";
-var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
-};
-var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.registerChannelRoutes = void 0;
-const typebox_1 = require("@sinclair/typebox");
-const index_1 = require("@db/index");
-const logger_1 = require("@utils/logger");
-const errors_1 = require("@utils/errors");
-const middleware_1 = require("@auth/middleware");
-const CacheService_1 = require("../../services/CacheService");
-const cache_decorators_1 = require("@utils/cache-decorators");
-const utils_1 = require("@websocket/utils");
-const validation_1 = require("@utils/validation");
-/**
- * Channel Management API Routes
- * Enterprise-grade channel CRUD operations with real-time updates
- */
-// Request/Response Schemas
-const CreateChannelSchema = typebox_1.Type.Object({
- name: typebox_1.Type.String({ minLength: 1, maxLength: 100 }),
- description: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 500 })),
- type: validation_1.ChannelTypeSchema,
- privacy: validation_1.ChannelPrivacySchema,
- parent_id: typebox_1.Type.Optional(validation_1.UUIDSchema),
- settings: typebox_1.Type.Optional(typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.Any())),
- tags: typebox_1.Type.Optional(typebox_1.Type.Array(typebox_1.Type.String({ maxLength: 50 }))),
- color: typebox_1.Type.Optional(typebox_1.Type.String({ pattern: '^#[0-9A-Fa-f]{6}$' })),
-});
-const UpdateChannelSchema = typebox_1.Type.Object({
- name: typebox_1.Type.Optional(typebox_1.Type.String({ minLength: 1, maxLength: 100 })),
- description: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 500 })),
- type: typebox_1.Type.Optional(validation_1.ChannelTypeSchema),
- privacy: typebox_1.Type.Optional(validation_1.ChannelPrivacySchema),
- settings: typebox_1.Type.Optional(typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.Any())),
- tags: typebox_1.Type.Optional(typebox_1.Type.Array(typebox_1.Type.String({ maxLength: 50 }))),
- color: typebox_1.Type.Optional(typebox_1.Type.String({ pattern: '^#[0-9A-Fa-f]{6}$' })),
-});
-const ChannelMemberSchema = typebox_1.Type.Object({
- user_id: validation_1.UUIDSchema,
- role: typebox_1.Type.Union([
- typebox_1.Type.Literal('owner'),
- typebox_1.Type.Literal('admin'),
- typebox_1.Type.Literal('member'),
- typebox_1.Type.Literal('viewer'),
- ]),
- joined_at: typebox_1.Type.String({ format: 'date-time' }),
- user_name: typebox_1.Type.String(),
- user_avatar: typebox_1.Type.Optional(typebox_1.Type.String()),
-});
-const ChannelResponseSchema = typebox_1.Type.Object({
- id: validation_1.UUIDSchema,
- name: typebox_1.Type.String(),
- description: typebox_1.Type.Optional(typebox_1.Type.String()),
- type: validation_1.ChannelTypeSchema,
- privacy: validation_1.ChannelPrivacySchema,
- parent_id: typebox_1.Type.Optional(validation_1.UUIDSchema),
- created_by: validation_1.UUIDSchema,
- settings: typebox_1.Type.Optional(typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.Any())),
- tags: typebox_1.Type.Array(typebox_1.Type.String()),
- color: typebox_1.Type.Optional(typebox_1.Type.String()),
- member_count: typebox_1.Type.Integer(),
- message_count: typebox_1.Type.Integer(),
- last_activity: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'date-time' })),
- created_at: typebox_1.Type.String({ format: 'date-time' }),
- updated_at: typebox_1.Type.String({ format: 'date-time' }),
-});
-/**
- * Channel service with caching
- */
-class ChannelService {
- async getChannelById(channelId) {
- return await index_1.channelRepository.findById(channelId);
- }
- async updateChannel(channelId, updateData) {
- // Map frontend fields to backend fields
- const mappedData = {};
- if (updateData.name !== undefined)
- mappedData.name = updateData.name;
- if (updateData.description !== undefined)
- mappedData.description = updateData.description;
- if (updateData.type !== undefined)
- mappedData.channel_type = updateData.type;
- if (updateData.privacy !== undefined)
- mappedData.privacy_level = updateData.privacy;
- if (updateData.settings !== undefined)
- mappedData.settings = updateData.settings;
- // Handle project_info updates
- if (updateData.tags !== undefined || updateData.color !== undefined) {
- const existingChannel = await index_1.channelRepository.findById(channelId);
- const currentProjectInfo = existingChannel?.project_info || {};
- mappedData.project_info = {
- ...currentProjectInfo,
- ...(updateData.tags !== undefined && { tags: updateData.tags }),
- ...(updateData.color !== undefined && { color: updateData.color }),
- };
- }
- return await index_1.channelRepository.update(channelId, mappedData);
- }
- async createChannel(channelData) {
- return await index_1.channelRepository.createChannel(channelData);
- }
-}
-__decorate([
- (0, cache_decorators_1.Cacheable)({
- ttl: 1800, // 30 minutes
- namespace: 'channels',
- keyGenerator: (channelId) => cache_decorators_1.CacheKeyUtils.channelKey(channelId),
- }),
- __metadata("design:type", Function),
- __metadata("design:paramtypes", [String]),
- __metadata("design:returntype", Promise)
-], ChannelService.prototype, "getChannelById", null);
-__decorate([
- (0, cache_decorators_1.CacheEvict)({
- keys: (channelId) => [cache_decorators_1.CacheKeyUtils.channelKey(channelId)],
- namespace: 'channels',
- }),
- __metadata("design:type", Function),
- __metadata("design:paramtypes", [String, Object]),
- __metadata("design:returntype", Promise)
-], ChannelService.prototype, "updateChannel", null);
-__decorate([
- (0, cache_decorators_1.CacheEvict)({
- allEntries: true,
- namespace: 'channels',
- }),
- __metadata("design:type", Function),
- __metadata("design:paramtypes", [Object]),
- __metadata("design:returntype", Promise)
-], ChannelService.prototype, "createChannel", null);
-const channelService = new ChannelService();
-/**
- * Register channel routes
- */
-const registerChannelRoutes = async (fastify) => {
- /**
- * GET /channels - List channels accessible to user
- */
- fastify.get('/channels', {
- preHandler: [middleware_1.authenticate, middleware_1.apiRateLimit],
- schema: {
- querystring: typebox_1.Type.Intersect([
- validation_1.PaginationSchema,
- typebox_1.Type.Object({
- type: typebox_1.Type.Optional(validation_1.ChannelTypeSchema),
- privacy: typebox_1.Type.Optional(validation_1.ChannelPrivacySchema),
- parent_id: typebox_1.Type.Optional(validation_1.UUIDSchema),
- search: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 100 })),
- }),
- ]),
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: typebox_1.Type.Array(ChannelResponseSchema),
- pagination: typebox_1.Type.Object({
- total: typebox_1.Type.Integer(),
- limit: typebox_1.Type.Integer(),
- offset: typebox_1.Type.Integer(),
- hasMore: typebox_1.Type.Boolean(),
- }),
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const { limit = 20, offset = 0, type, privacy, parent_id, search } = request.query;
- // Build filters
- const filters = {};
- if (type)
- filters.type = type;
- if (privacy)
- filters.privacy = privacy;
- if (parent_id)
- filters.parent_id = parent_id;
- if (search)
- filters.search = search;
- // Get channels user has access to
- const result = await index_1.channelRepository.findUserChannels(request.user.userId);
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- filters,
- resultCount: result.length,
- }, 'Channels list retrieved');
- reply.send({
- success: true,
- data: result,
- pagination: {
- total: result.length,
- limit,
- offset,
- hasMore: false,
- },
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to retrieve channels');
- reply.code(500).send({
- error: {
- message: 'Failed to retrieve channels',
- code: 'SERVER_ERROR',
- },
- });
- }
- });
- /**
- * GET /channels/categories - Get available channel categories
- */
- fastify.get('/channels/categories', {
- preHandler: [middleware_1.authenticate],
- schema: {
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: typebox_1.Type.Array(typebox_1.Type.Object({
- id: typebox_1.Type.String(),
- name: typebox_1.Type.String(),
- description: typebox_1.Type.String(),
- icon: typebox_1.Type.Optional(typebox_1.Type.String()),
- color: typebox_1.Type.Optional(typebox_1.Type.String()),
- })),
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- // Define available channel categories based on ChannelTypeSchema
- const categories = [
- {
- id: 'general',
- name: 'General',
- description: 'General purpose discussions and communications',
- icon: 'chatbubble-outline',
- color: '#6B7280',
- },
- {
- id: 'project',
- name: 'Project',
- description: 'Project-specific discussions and collaboration',
- icon: 'folder-outline',
- color: '#3B82F6',
- },
- {
- id: 'department',
- name: 'Department',
- description: 'Department-wide communications and updates',
- icon: 'business-outline',
- color: '#10B981',
- },
- {
- id: 'announcement',
- name: 'Announcement',
- description: 'Official announcements and important updates',
- icon: 'megaphone-outline',
- color: '#F59E0B',
- },
- {
- id: 'private',
- name: 'Private',
- description: 'Private discussions and confidential matters',
- icon: 'lock-closed-outline',
- color: '#8B5CF6',
- },
- ];
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- categoriesCount: categories.length,
- }, 'Channel categories retrieved');
- reply.send({
- success: true,
- data: categories,
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to retrieve channel categories');
- reply.code(500).send({
- error: {
- message: 'Failed to retrieve channel categories',
- code: 'SERVER_ERROR',
- },
- });
- }
- });
- /**
- * GET /channels/:id - Get channel details
- */
- fastify.get('/channels/:id', {
- preHandler: [middleware_1.authenticate, middleware_1.requireChannelAccess],
- schema: {
- params: typebox_1.Type.Object({
- id: validation_1.UUIDSchema,
- }),
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: ChannelResponseSchema,
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const { id } = request.params;
- const channel = await channelService.getChannelById(id);
- if (!channel) {
- throw new errors_1.NotFoundError('Channel not found');
- }
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- channelId: id,
- }, 'Channel details retrieved');
- reply.send({
- success: true,
- data: channel,
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to retrieve channel');
- if (error instanceof errors_1.NotFoundError) {
- reply.code(404).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to retrieve channel',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * POST /channels - Create new channel
- */
- fastify.post('/channels', {
- preHandler: [middleware_1.authenticate, (0, middleware_1.authorize)('channels:create')],
- schema: {
- body: CreateChannelSchema,
- response: {
- 201: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: ChannelResponseSchema,
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const channelData = {
- name: request.body.name,
- description: request.body.description,
- channel_type: request.body.type,
- privacy_level: request.body.privacy,
- created_by: request.user.userId,
- settings: request.body.settings || {},
- project_info: {
- tags: request.body.tags || [],
- ...(request.body.color && { color: request.body.color }),
- },
- ...(request.body.parent_id && { parent_id: request.body.parent_id }),
- };
- const channel = await channelService.createChannel(channelData);
- // Creator is already added as member in createChannel method
- // await channelRepository.addMember(channel.id, request.user!.userId, request.user!.userId);
- // Create activity for channel creation
- try {
- await index_1.activityRepository.createActivity({
- channelId: channel.id,
- userId: request.user.userId,
- activityType: 'channel_created',
- title: `Channel Created: ${channel.name}`,
- description: `New ${channel.channel_type} channel "${channel.name}" was created${channel.description ? ': ' + channel.description : ''}`,
- category: 'channel',
- metadata: {
- channelId: channel.id,
- channelName: channel.name,
- channelType: channel.channel_type,
- channelPrivacy: channel.privacy_level,
- parentId: channel.parent_id,
- createdBy: request.user.userId,
- createdByName: request.user.name,
- tags: request.body.tags || [],
- settings: channel.settings
- }
- });
- }
- catch (error) {
- logger_1.loggers.api.warn?.({ error, channelId: channel.id }, 'Failed to create channel creation activity');
- }
- // Broadcast channel creation
- await utils_1.WebSocketUtils.broadcastChannelMessage({
- type: 'chat_message',
- channelId: channel.id,
- messageId: `system_${Date.now()}`,
- message: `Channel "${channel.name}" created`,
- messageType: 'system',
- userId: request.user.userId,
- userName: request.user.name,
- userRole: request.user.role,
- });
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- channelId: channel.id,
- channelName: channel.name,
- channelType: channel.channel_type,
- }, 'Channel created successfully');
- reply.code(201).send({
- success: true,
- data: channel,
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to create channel');
- if (error instanceof errors_1.ValidationError) {
- reply.code(400).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to create channel',
- code: 'SERVER_ERROR',
- ...(process.env.NODE_ENV === 'development' && {
- details: error instanceof Error ? error.message : String(error),
- stack: error instanceof Error ? error.stack : undefined,
- }),
- },
- });
- }
- }
- });
- /**
- * PUT /channels/:id - Update channel
- */
- fastify.put('/channels/:id', {
- preHandler: [middleware_1.authenticate, middleware_1.requireChannelAccess, (0, middleware_1.authorize)('channels:update')],
- schema: {
- params: typebox_1.Type.Object({
- id: validation_1.UUIDSchema,
- }),
- body: UpdateChannelSchema,
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: ChannelResponseSchema,
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const { id } = request.params;
- const updateData = request.body;
- const channel = await channelService.updateChannel(id, updateData);
- // Broadcast channel update
- await utils_1.WebSocketUtils.sendToChannel(id, 'channel_updated', {
- type: 'channel_updated',
- channelId: id,
- updates: updateData,
- userId: request.user.userId,
- userName: request.user.name,
- userRole: request.user.role,
- timestamp: new Date().toISOString(),
- });
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- channelId: id,
- updatedFields: Object.keys(updateData),
- }, 'Channel updated successfully');
- reply.send({
- success: true,
- data: channel,
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to update channel');
- if (error instanceof errors_1.NotFoundError) {
- reply.code(404).send((0, errors_1.formatErrorResponse)(error));
- }
- else if (error instanceof errors_1.ValidationError) {
- reply.code(400).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to update channel',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * DELETE /channels/:id - Delete channel
- */
- fastify.delete('/channels/:id', {
- preHandler: [middleware_1.authenticate, middleware_1.requireChannelAccess, (0, middleware_1.authorize)('channels:delete')],
- schema: {
- params: typebox_1.Type.Object({
- id: validation_1.UUIDSchema,
- }),
- response: {
- 200: validation_1.SuccessResponseSchema,
- },
- },
- }, async (request, reply) => {
- try {
- const { id } = request.params;
- const success = await index_1.channelRepository.softDelete(id, request.user.userId);
- if (!success) {
- throw new errors_1.NotFoundError('Channel not found');
- }
- // Clear channel cache
- await CacheService_1.cacheService.channels.delete(cache_decorators_1.CacheKeyUtils.channelKey(id));
- // Broadcast channel deletion
- await utils_1.WebSocketUtils.sendToChannel(id, 'channel_deleted', {
- type: 'channel_deleted',
- channelId: id,
- userId: request.user.userId,
- userName: request.user.name,
- userRole: request.user.role,
- timestamp: new Date().toISOString(),
- });
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- channelId: id,
- }, 'Channel deleted successfully');
- reply.send({
- success: true,
- message: 'Channel deleted successfully',
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to delete channel');
- if (error instanceof errors_1.NotFoundError) {
- reply.code(404).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to delete channel',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * GET /channels/:id/members - Get channel members
- */
- fastify.get('/channels/:id/members', {
- preHandler: [middleware_1.authenticate, middleware_1.requireChannelAccess],
- schema: {
- params: typebox_1.Type.Object({
- id: validation_1.UUIDSchema,
- }),
- querystring: validation_1.PaginationSchema,
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: typebox_1.Type.Array(ChannelMemberSchema),
- pagination: typebox_1.Type.Object({
- total: typebox_1.Type.Integer(),
- limit: typebox_1.Type.Integer(),
- offset: typebox_1.Type.Integer(),
- hasMore: typebox_1.Type.Boolean(),
- }),
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const { id } = request.params;
- const { limit = 50, offset = 0 } = request.query;
- const members = await index_1.channelRepository.getMembers(id);
- // Map the members data to match the expected schema
- const mappedMembers = members.map((member) => ({
- user_id: member.id,
- role: member.role,
- joined_at: new Date().toISOString(), // TODO: Get actual joined_at from channel_member_history
- user_name: member.name,
- user_avatar: member.avatar_url,
- }));
- const result = {
- data: mappedMembers.slice(offset, offset + limit),
- total: mappedMembers.length,
- };
- reply.send({
- success: true,
- data: result.data,
- pagination: {
- total: result.total,
- limit,
- offset,
- hasMore: offset + limit < result.total,
- },
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to retrieve channel members');
- reply.code(500).send({
- error: {
- message: 'Failed to retrieve channel members',
- code: 'SERVER_ERROR',
- },
- });
- }
- });
- /**
- * POST /channels/:id/members - Add member to channel
- */
- fastify.post('/channels/:id/members', {
- preHandler: [middleware_1.authenticate, middleware_1.requireChannelAccess, (0, middleware_1.authorize)('channels:manage_members')],
- schema: {
- params: typebox_1.Type.Object({
- id: validation_1.UUIDSchema,
- }),
- body: typebox_1.Type.Object({
- user_id: validation_1.UUIDSchema,
- role: typebox_1.Type.Optional(typebox_1.Type.Union([typebox_1.Type.Literal('admin'), typebox_1.Type.Literal('member'), typebox_1.Type.Literal('viewer')])),
- }),
- response: {
- 200: validation_1.SuccessResponseSchema,
- },
- },
- }, async (request, reply) => {
- try {
- const { id } = request.params;
- const { user_id, role = 'member' } = request.body;
- const success = await index_1.channelRepository.addMember(id, user_id, role);
- if (!success) {
- throw new errors_1.ValidationError('Failed to add member to channel', []);
- }
- // Broadcast member addition
- await utils_1.WebSocketUtils.sendToChannel(id, 'user_joined_channel', {
- type: 'user_joined_channel',
- channelId: id,
- userId: user_id,
- userName: '', // TODO: Get user name
- userRole: request.user.role,
- memberCount: (await index_1.channelRepository.getMembers(id)).length,
- timestamp: new Date().toISOString(),
- });
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- channelId: id,
- addedUserId: user_id,
- memberRole: role,
- }, 'Member added to channel');
- reply.send({
- success: true,
- message: 'Member added successfully',
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to add member to channel');
- if (error instanceof errors_1.ValidationError) {
- reply.code(400).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to add member',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * DELETE /channels/:id/members/:user_id - Remove member from channel
- */
- fastify.delete('/channels/:id/members/:user_id', {
- preHandler: [middleware_1.authenticate, middleware_1.requireChannelAccess, (0, middleware_1.authorize)('channels:manage_members')],
- schema: {
- params: typebox_1.Type.Object({
- id: validation_1.UUIDSchema,
- user_id: validation_1.UUIDSchema,
- }),
- response: {
- 200: validation_1.SuccessResponseSchema,
- },
- },
- }, async (request, reply) => {
- try {
- const { id, user_id } = request.params;
- const success = await index_1.channelRepository.removeMember(id, user_id, request.user.userId);
- if (!success) {
- throw new errors_1.NotFoundError('Member not found in channel');
- }
- // Broadcast member removal
- await utils_1.WebSocketUtils.sendToChannel(id, 'user_left_channel', {
- type: 'user_left_channel',
- channelId: id,
- userId: user_id,
- userName: '', // TODO: Get user name
- userRole: request.user.role,
- memberCount: (await index_1.channelRepository.getMembers(id)).length,
- timestamp: new Date().toISOString(),
- });
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- channelId: id,
- removedUserId: user_id,
- }, 'Member removed from channel');
- reply.send({
- success: true,
- message: 'Member removed successfully',
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to remove member from channel');
- if (error instanceof errors_1.NotFoundError) {
- reply.code(404).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to remove member',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * GET /channels/:id/files - Get channel file attachments
- */
- fastify.get('/channels/:id/files', {
- preHandler: [middleware_1.authenticate, middleware_1.requireChannelAccess],
- schema: {
- params: typebox_1.Type.Object({
- id: validation_1.UUIDSchema,
- }),
- querystring: typebox_1.Type.Intersect([
- validation_1.PaginationSchema,
- typebox_1.Type.Object({
- file_type: typebox_1.Type.Optional(typebox_1.Type.String()),
- uploaded_by: typebox_1.Type.Optional(validation_1.UUIDSchema),
- search: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 100 })),
- }),
- ]),
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: typebox_1.Type.Array(typebox_1.Type.Object({
- id: validation_1.UUIDSchema,
- filename: typebox_1.Type.String(),
- originalName: typebox_1.Type.String(),
- mimeType: typebox_1.Type.String(),
- size: typebox_1.Type.Integer(),
- url: typebox_1.Type.String(),
- downloadUrl: typebox_1.Type.Optional(typebox_1.Type.String()),
- thumbnailUrl: typebox_1.Type.Optional(typebox_1.Type.String()),
- uploadedBy: validation_1.UUIDSchema,
- uploadedByName: typebox_1.Type.String(),
- uploadedAt: typebox_1.Type.String({ format: 'date-time' }),
- messageId: typebox_1.Type.Optional(validation_1.UUIDSchema),
- })),
- pagination: typebox_1.Type.Object({
- total: typebox_1.Type.Integer(),
- limit: typebox_1.Type.Integer(),
- offset: typebox_1.Type.Integer(),
- hasMore: typebox_1.Type.Boolean(),
- }),
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const { id } = request.params;
- const { limit = 50, offset = 0, file_type, uploaded_by, search } = request.query;
- // Build filters
- const filters = {
- channelId: id,
- fileType: file_type,
- uploadedBy: uploaded_by,
- search,
- };
- let files = [];
- let total = 0;
- try {
- // Try to fetch files, but handle database errors gracefully
- files = await index_1.fileRepository.findChannelFiles(id, filters, limit, offset);
- total = await index_1.fileRepository.getChannelFileCount(id, filters);
- }
- catch (dbError) {
- // Log database errors but return empty results instead of failing
- logger_1.loggers.api.warn({
- userId: request.user?.userId,
- channelId: id,
- error: dbError.message,
- filters,
- }, 'Channel files database query failed, returning empty results');
- // Return empty results if database query fails
- files = [];
- total = 0;
- }
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- channelId: id,
- fileCount: files.length,
- filters,
- }, 'Channel files retrieved');
- reply.send({
- success: true,
- data: files,
- pagination: {
- total,
- limit,
- offset,
- hasMore: offset + limit < total,
- },
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.warn({ error, context }, 'Failed to retrieve channel files, returning empty results');
- // Return empty results instead of error to prevent frontend issues
- reply.send({
- success: true,
- data: [],
- pagination: {
- total: 0,
- limit: request.query.limit || 50,
- offset: request.query.offset || 0,
- hasMore: false,
- },
- timestamp: new Date().toISOString(),
- });
- }
- });
- /**
- * GET /channels/:id/activity - Get channel activity log
- */
- fastify.get('/channels/:id/activity', {
- preHandler: [middleware_1.authenticate, middleware_1.requireChannelAccess],
- schema: {
- params: typebox_1.Type.Object({
- id: validation_1.UUIDSchema,
- }),
- querystring: typebox_1.Type.Intersect([
- validation_1.PaginationSchema,
- typebox_1.Type.Object({
- activity_type: typebox_1.Type.Optional(typebox_1.Type.Union([
- typebox_1.Type.Literal('message'),
- typebox_1.Type.Literal('task_created'),
- typebox_1.Type.Literal('task_updated'),
- typebox_1.Type.Literal('task_completed'),
- typebox_1.Type.Literal('member_joined'),
- typebox_1.Type.Literal('member_left'),
- typebox_1.Type.Literal('file_uploaded'),
- typebox_1.Type.Literal('channel_updated'),
- ])),
- user_id: typebox_1.Type.Optional(validation_1.UUIDSchema),
- after: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'date-time' })),
- }),
- ]),
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: typebox_1.Type.Array(typebox_1.Type.Object({
- id: validation_1.UUIDSchema,
- channelId: validation_1.UUIDSchema,
- activityType: typebox_1.Type.String(),
- userId: validation_1.UUIDSchema,
- userName: typebox_1.Type.String(),
- userAvatar: typebox_1.Type.Optional(typebox_1.Type.String()),
- title: typebox_1.Type.String(),
- description: typebox_1.Type.Optional(typebox_1.Type.String()),
- metadata: typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.Any()),
- createdAt: typebox_1.Type.String({ format: 'date-time' }),
- })),
- pagination: typebox_1.Type.Object({
- total: typebox_1.Type.Integer(),
- limit: typebox_1.Type.Integer(),
- offset: typebox_1.Type.Integer(),
- hasMore: typebox_1.Type.Boolean(),
- }),
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const { id } = request.params;
- const { limit = 50, offset = 0, activity_type, user_id, after } = request.query;
- // Build filters
- const filters = {
- channelId: id,
- activityType: activity_type,
- userId: user_id,
- after: after ? new Date(after) : undefined,
- };
- // This would require implementing activity repository methods
- const activities = await index_1.activityRepository.findChannelActivities(id, filters, limit, offset);
- const total = await index_1.activityRepository.getChannelActivityCount(id, filters);
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- channelId: id,
- activityCount: activities.length,
- filters,
- }, 'Channel activity retrieved');
- reply.send({
- success: true,
- data: activities,
- pagination: {
- total,
- limit,
- offset,
- hasMore: offset + limit < total,
- },
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to retrieve channel activity');
- reply.code(500).send({
- error: {
- message: 'Failed to retrieve channel activity',
- code: 'SERVER_ERROR',
- },
- });
- }
- });
- /**
- * POST /channels/:id/activity - Log channel activity
- */
- fastify.post('/channels/:id/activity', {
- preHandler: [middleware_1.authenticate, middleware_1.requireChannelAccess],
- schema: {
- params: typebox_1.Type.Object({
- id: validation_1.UUIDSchema,
- }),
- body: typebox_1.Type.Object({
- activity_type: typebox_1.Type.String({ minLength: 1, maxLength: 50 }),
- title: typebox_1.Type.String({ minLength: 1, maxLength: 200 }),
- description: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 1000 })),
- metadata: typebox_1.Type.Optional(typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.Any())),
- }),
- response: {
- 201: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: typebox_1.Type.Object({
- id: validation_1.UUIDSchema,
- activityType: typebox_1.Type.String(),
- title: typebox_1.Type.String(),
- description: typebox_1.Type.Optional(typebox_1.Type.String()),
- metadata: typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.Any()),
- createdAt: typebox_1.Type.String({ format: 'date-time' }),
- }),
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const { id } = request.params;
- const { activity_type, title, description, metadata } = request.body;
- const activityData = {
- channelId: id,
- activityType: activity_type,
- userId: request.user.userId,
- title,
- description: description || '',
- metadata: metadata || {},
- };
- const activity = await index_1.activityRepository.createActivity(activityData);
- // Broadcast activity to channel members
- await utils_1.WebSocketUtils.sendToChannel(id, 'channel_activity', {
- type: 'channel_activity',
- channelId: id,
- activity: {
- id: activity.id,
- activityType: activity.activity_type,
- title: activity.title,
- description: activity.description,
- metadata: activity.metadata,
- userId: request.user.userId,
- userName: request.user.name,
- userAvatar: null, // Avatar not available in TokenPayload
- createdAt: activity.created_at,
- },
- userId: request.user.userId,
- userName: request.user.name,
- userRole: request.user.role,
- timestamp: new Date().toISOString(),
- });
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- channelId: id,
- activityId: activity.id,
- activityType: activity_type,
- }, 'Channel activity logged successfully');
- reply.code(201).send({
- success: true,
- data: {
- id: activity.id,
- activityType: activity.activity_type,
- title: activity.title,
- description: activity.description,
- metadata: activity.metadata,
- createdAt: activity.created_at,
- },
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to log channel activity');
- if (error instanceof errors_1.ValidationError) {
- reply.code(400).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to log channel activity',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
-};
-exports.registerChannelRoutes = registerChannelRoutes;
-//# sourceMappingURL=ChannelRoutes.js.map
\ No newline at end of file
diff --git a/backend/dist/api/routes/ChannelRoutes.js.map b/backend/dist/api/routes/ChannelRoutes.js.map
deleted file mode 100644
index 60bbe5d..0000000
--- a/backend/dist/api/routes/ChannelRoutes.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ChannelRoutes.js","sourceRoot":"","sources":["../../../src/api/routes/ChannelRoutes.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/api/routes/DocsRoutes.d.ts b/backend/dist/api/routes/DocsRoutes.d.ts
deleted file mode 100644
index 254d56d..0000000
--- a/backend/dist/api/routes/DocsRoutes.d.ts
+++ /dev/null
@@ -1,7 +0,0 @@
-import { FastifyInstance } from 'fastify';
-/**
- * Documentation Routes - Swagger/OpenAPI Integration
- * Provides interactive API documentation via Swagger UI
- */
-export declare const registerDocsRoutes: (fastify: FastifyInstance) => Promise;
-//# sourceMappingURL=DocsRoutes.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/api/routes/DocsRoutes.d.ts.map b/backend/dist/api/routes/DocsRoutes.d.ts.map
deleted file mode 100644
index 7e90a05..0000000
--- a/backend/dist/api/routes/DocsRoutes.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"DocsRoutes.d.ts","sourceRoot":"","sources":["../../../src/api/routes/DocsRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAE1C;;;GAGG;AAEH,eAAO,MAAM,kBAAkB,GAAU,SAAS,eAAe,kBA2EhE,CAAC"}
\ No newline at end of file
diff --git a/backend/dist/api/routes/DocsRoutes.js b/backend/dist/api/routes/DocsRoutes.js
deleted file mode 100644
index 47c4a96..0000000
--- a/backend/dist/api/routes/DocsRoutes.js
+++ /dev/null
@@ -1,83 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.registerDocsRoutes = void 0;
-/**
- * Documentation Routes - Swagger/OpenAPI Integration
- * Provides interactive API documentation via Swagger UI
- */
-const registerDocsRoutes = async (fastify) => {
- // The Swagger UI will be available at /docs
- // All route schemas are automatically collected by @fastify/swagger
- /**
- * Redirect root docs to Swagger UI
- */
- fastify.get('/docs', async (request, reply) => {
- reply.redirect('/docs/');
- });
- /**
- * API Health Status endpoint with OpenAPI schema
- */
- fastify.get('/health/api', {
- schema: {
- tags: ['Health'],
- summary: 'API Health Status',
- description: 'Get detailed API health status with features and endpoints',
- response: {
- 200: {
- type: 'object',
- properties: {
- status: { type: 'string', example: 'healthy' },
- version: { type: 'string', example: '1.0.0' },
- environment: { type: 'string', example: 'development' },
- features: {
- type: 'object',
- properties: {
- authentication: { type: 'string', example: 'enabled' },
- websockets: { type: 'string', example: 'enabled' },
- caching: { type: 'string', example: 'enabled' },
- rateLimit: { type: 'string', example: 'enabled' },
- voiceCommands: { type: 'string', example: 'ready' },
- analytics: { type: 'string', example: 'ready' },
- }
- },
- endpoints: {
- type: 'object',
- properties: {
- auth: { type: 'string', example: '/api/v1/auth/*' },
- users: { type: 'string', example: '/api/v1/users/*' },
- channels: { type: 'string', example: '/api/v1/channels/*' },
- tasks: { type: 'string', example: '/api/v1/tasks/*' },
- docs: { type: 'string', example: '/docs' },
- }
- },
- timestamp: { type: 'string', format: 'date-time' },
- }
- }
- }
- }
- }, async (request, reply) => {
- reply.send({
- status: 'healthy',
- version: '1.0.0',
- environment: process.env.NODE_ENV || 'development',
- features: {
- authentication: 'enabled',
- websockets: 'enabled',
- caching: 'enabled',
- rateLimit: 'enabled',
- voiceCommands: 'ready',
- analytics: 'ready',
- },
- endpoints: {
- auth: '/api/v1/auth/*',
- users: '/api/v1/users/*',
- channels: '/api/v1/channels/*',
- tasks: '/api/v1/tasks/*',
- docs: '/docs',
- },
- timestamp: new Date().toISOString(),
- });
- });
-};
-exports.registerDocsRoutes = registerDocsRoutes;
-//# sourceMappingURL=DocsRoutes.js.map
\ No newline at end of file
diff --git a/backend/dist/api/routes/DocsRoutes.js.map b/backend/dist/api/routes/DocsRoutes.js.map
deleted file mode 100644
index 4c7d72f..0000000
--- a/backend/dist/api/routes/DocsRoutes.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"DocsRoutes.js","sourceRoot":"","sources":["../../../src/api/routes/DocsRoutes.ts"],"names":[],"mappings":";;;AAEA;;;GAGG;AAEI,MAAM,kBAAkB,GAAG,KAAK,EAAE,OAAwB,EAAE,EAAE;IACnE,4CAA4C;IAC5C,oEAAoE;IAEpE;;OAEG;IACH,OAAO,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC5C,KAAK,CAAC,QAAQ,CAAC,QAAQ,CAAC,CAAC;IAC3B,CAAC,CAAC,CAAC;IAEH;;OAEG;IACH,OAAO,CAAC,GAAG,CAAC,aAAa,EAAE;QACzB,MAAM,EAAE;YACN,IAAI,EAAE,CAAC,QAAQ,CAAC;YAChB,OAAO,EAAE,mBAAmB;YAC5B,WAAW,EAAE,4DAA4D;YACzE,QAAQ,EAAE;gBACR,GAAG,EAAE;oBACH,IAAI,EAAE,QAAQ;oBACd,UAAU,EAAE;wBACV,MAAM,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE;wBAC9C,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;wBAC7C,WAAW,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,aAAa,EAAE;wBACvD,QAAQ,EAAE;4BACR,IAAI,EAAE,QAAQ;4BACd,UAAU,EAAE;gCACV,cAAc,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE;gCACtD,UAAU,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE;gCAClD,OAAO,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE;gCAC/C,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE;gCACjD,aAAa,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;gCACnD,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;6BAChD;yBACF;wBACD,SAAS,EAAE;4BACT,IAAI,EAAE,QAAQ;4BACd,UAAU,EAAE;gCACV,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,gBAAgB,EAAE;gCACnD,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE;gCACrD,QAAQ,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,oBAAoB,EAAE;gCAC3D,KAAK,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,iBAAiB,EAAE;gCACrD,IAAI,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,OAAO,EAAE,OAAO,EAAE;6BAC3C;yBACF;wBACD,SAAS,EAAE,EAAE,IAAI,EAAE,QAAQ,EAAE,MAAM,EAAE,WAAW,EAAE;qBACnD;iBACF;aACF;SACF;KACF,EAAE,KAAK,EAAE,OAAO,EAAE,KAAK,EAAE,EAAE;QAC1B,KAAK,CAAC,IAAI,CAAC;YACT,MAAM,EAAE,SAAS;YACjB,OAAO,EAAE,OAAO;YAChB,WAAW,EAAE,OAAO,CAAC,GAAG,CAAC,QAAQ,IAAI,aAAa;YAClD,QAAQ,EAAE;gBACR,cAAc,EAAE,SAAS;gBACzB,UAAU,EAAE,SAAS;gBACrB,OAAO,EAAE,SAAS;gBAClB,SAAS,EAAE,SAAS;gBACpB,aAAa,EAAE,OAAO;gBACtB,SAAS,EAAE,OAAO;aACnB;YACD,SAAS,EAAE;gBACT,IAAI,EAAE,gBAAgB;gBACtB,KAAK,EAAE,iBAAiB;gBACxB,QAAQ,EAAE,oBAAoB;gBAC9B,KAAK,EAAE,iBAAiB;gBACxB,IAAI,EAAE,OAAO;aACd;YACD,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;SACpC,CAAC,CAAC;IACL,CAAC,CAAC,CAAC;AACL,CAAC,CAAC;AA3EW,QAAA,kBAAkB,sBA2E7B"}
\ No newline at end of file
diff --git a/backend/dist/api/routes/MessageRoutes.d.ts b/backend/dist/api/routes/MessageRoutes.d.ts
deleted file mode 100644
index 66e6f00..0000000
--- a/backend/dist/api/routes/MessageRoutes.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { FastifyInstance } from 'fastify';
-/**
- * Register message routes
- */
-export declare const registerMessageRoutes: (fastify: FastifyInstance) => Promise;
-//# sourceMappingURL=MessageRoutes.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/api/routes/MessageRoutes.d.ts.map b/backend/dist/api/routes/MessageRoutes.d.ts.map
deleted file mode 100644
index fbe0e0b..0000000
--- a/backend/dist/api/routes/MessageRoutes.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"MessageRoutes.d.ts","sourceRoot":"","sources":["../../../src/api/routes/MessageRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AA2HxE;;GAEG;AACH,eAAO,MAAM,qBAAqB,GAAU,SAAS,eAAe,kBAu0BnE,CAAC"}
\ No newline at end of file
diff --git a/backend/dist/api/routes/MessageRoutes.js b/backend/dist/api/routes/MessageRoutes.js
deleted file mode 100644
index 9b4bdeb..0000000
--- a/backend/dist/api/routes/MessageRoutes.js
+++ /dev/null
@@ -1,829 +0,0 @@
-"use strict";
-var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
-};
-var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.registerMessageRoutes = void 0;
-const typebox_1 = require("@sinclair/typebox");
-const index_1 = require("@db/index");
-const logger_1 = require("@utils/logger");
-const errors_1 = require("@utils/errors");
-const middleware_1 = require("@auth/middleware");
-const CacheService_1 = require("../../services/CacheService");
-const cache_decorators_1 = require("@utils/cache-decorators");
-const utils_1 = require("@websocket/utils");
-const validation_1 = require("@utils/validation");
-/**
- * Channel Message Management API Routes
- * Enterprise-grade messaging system with real-time updates
- */
-// Request/Response Schemas
-const SendMessageSchema = typebox_1.Type.Object({
- content: typebox_1.Type.String({ minLength: 1, maxLength: 4000 }),
- message_type: typebox_1.Type.Optional(typebox_1.Type.Union([
- typebox_1.Type.Literal('text'),
- typebox_1.Type.Literal('voice'),
- typebox_1.Type.Literal('file'),
- typebox_1.Type.Literal('system'),
- ])),
- reply_to: typebox_1.Type.Optional(validation_1.UUIDSchema),
- thread_root: typebox_1.Type.Optional(validation_1.UUIDSchema),
- mentions: typebox_1.Type.Optional(typebox_1.Type.Array(validation_1.UUIDSchema)),
- attachments: typebox_1.Type.Optional(typebox_1.Type.Array(typebox_1.Type.Object({
- file_id: validation_1.UUIDSchema,
- filename: typebox_1.Type.String(),
- file_type: typebox_1.Type.String(),
- file_size: typebox_1.Type.Integer(),
- }))),
- voice_data: typebox_1.Type.Optional(typebox_1.Type.Object({
- duration: typebox_1.Type.Number(),
- transcript: typebox_1.Type.Optional(typebox_1.Type.String()),
- voice_file_id: typebox_1.Type.Optional(validation_1.UUIDSchema),
- })),
- metadata: typebox_1.Type.Optional(typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.Any())),
-});
-const UpdateMessageSchema = typebox_1.Type.Object({
- content: typebox_1.Type.String({ minLength: 1, maxLength: 4000 }),
-});
-const MessageResponseSchema = typebox_1.Type.Object({
- id: validation_1.UUIDSchema,
- channel_id: validation_1.UUIDSchema,
- task_id: typebox_1.Type.Optional(validation_1.UUIDSchema),
- user_id: validation_1.UUIDSchema,
- user_name: typebox_1.Type.String(),
- user_avatar: typebox_1.Type.Optional(typebox_1.Type.String()),
- content: typebox_1.Type.String(),
- message_type: typebox_1.Type.String(),
- voice_data: typebox_1.Type.Optional(typebox_1.Type.Any()),
- transcription: typebox_1.Type.Optional(typebox_1.Type.String()),
- attachments: typebox_1.Type.Array(typebox_1.Type.Any()),
- reply_to: typebox_1.Type.Optional(validation_1.UUIDSchema),
- thread_root: typebox_1.Type.Optional(validation_1.UUIDSchema),
- is_edited: typebox_1.Type.Boolean(),
- is_pinned: typebox_1.Type.Boolean(),
- is_announcement: typebox_1.Type.Boolean(),
- reactions: typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.Any()),
- mentions: typebox_1.Type.Array(validation_1.UUIDSchema),
- ai_generated: typebox_1.Type.Boolean(),
- ai_context: typebox_1.Type.Optional(typebox_1.Type.Any()),
- command_execution_id: typebox_1.Type.Optional(validation_1.UUIDSchema),
- metadata: typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.Any()),
- reply_count: typebox_1.Type.Optional(typebox_1.Type.Integer()),
- last_reply_timestamp: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'date-time' })),
- created_at: typebox_1.Type.String({ format: 'date-time' }),
- updated_at: typebox_1.Type.String({ format: 'date-time' }),
- edited_at: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'date-time' })),
-});
-/**
- * Message service with caching
- */
-class MessageService {
- async getMessageById(messageId) {
- return await index_1.messageRepository.findById(messageId);
- }
- async createMessage(messageData) {
- return await index_1.messageRepository.createMessage(messageData);
- }
- async updateMessage(messageId, updateData) {
- return await index_1.messageRepository.updateMessage(messageId, updateData);
- }
-}
-__decorate([
- (0, cache_decorators_1.Cacheable)({
- ttl: 300, // 5 minutes
- namespace: 'messages',
- keyGenerator: (messageId) => cache_decorators_1.CacheKeyUtils.messageKey(messageId),
- }),
- __metadata("design:type", Function),
- __metadata("design:paramtypes", [String]),
- __metadata("design:returntype", Promise)
-], MessageService.prototype, "getMessageById", null);
-__decorate([
- (0, cache_decorators_1.CacheEvict)({
- keys: (channelId) => [cache_decorators_1.CacheKeyUtils.channelMessagesKey(channelId)],
- namespace: 'messages',
- }),
- __metadata("design:type", Function),
- __metadata("design:paramtypes", [Object]),
- __metadata("design:returntype", Promise)
-], MessageService.prototype, "createMessage", null);
-__decorate([
- (0, cache_decorators_1.CacheEvict)({
- keys: (messageId, channelId) => [
- cache_decorators_1.CacheKeyUtils.messageKey(messageId),
- cache_decorators_1.CacheKeyUtils.channelMessagesKey(channelId),
- ],
- namespace: 'messages',
- }),
- __metadata("design:type", Function),
- __metadata("design:paramtypes", [String, Object]),
- __metadata("design:returntype", Promise)
-], MessageService.prototype, "updateMessage", null);
-const messageService = new MessageService();
-/**
- * Register message routes
- */
-const registerMessageRoutes = async (fastify) => {
- /**
- * GET /channels/:channelId/messages - Get channel messages
- */
- fastify.get('/channels/:channelId/messages', {
- preHandler: [middleware_1.authenticate, middleware_1.requireChannelAccess, middleware_1.apiRateLimit],
- schema: {
- params: typebox_1.Type.Object({
- channelId: validation_1.UUIDSchema,
- }),
- querystring: typebox_1.Type.Intersect([
- validation_1.PaginationSchema,
- typebox_1.Type.Object({
- thread_root: typebox_1.Type.Optional(validation_1.UUIDSchema),
- search: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 200 })),
- message_type: typebox_1.Type.Optional(typebox_1.Type.String()),
- before: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'date-time' })),
- after: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'date-time' })),
- }),
- ]),
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: typebox_1.Type.Array(MessageResponseSchema),
- pagination: typebox_1.Type.Object({
- total: typebox_1.Type.Integer(),
- limit: typebox_1.Type.Integer(),
- offset: typebox_1.Type.Integer(),
- hasMore: typebox_1.Type.Boolean(),
- }),
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const { channelId } = request.params;
- const { limit = 50, offset = 0, thread_root, search, message_type, before, after, } = request.query;
- // Build filters
- const filters = {
- channelId,
- threadRoot: thread_root,
- messageType: message_type,
- before: before ? new Date(before) : undefined,
- after: after ? new Date(after) : undefined,
- };
- let messages = [];
- let total = 0;
- if (search) {
- // Search messages
- messages = await index_1.messageRepository.searchMessages(channelId, search, Math.min(limit, 100), offset);
- total = messages.length; // Approximation
- }
- else {
- // Get messages with filters
- messages = await index_1.messageRepository.findChannelMessages(channelId, filters, Math.min(limit, 100), offset);
- total = await index_1.messageRepository.getChannelMessageCount(channelId, filters);
- }
- // Update last read for user
- await index_1.messageRepository.updateLastRead(channelId, request.user.userId);
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- channelId,
- messageCount: messages.length,
- filters,
- }, 'Channel messages retrieved');
- reply.send({
- success: true,
- data: messages,
- pagination: {
- total,
- limit,
- offset,
- hasMore: offset + limit < total,
- },
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to retrieve channel messages');
- reply.code(500).send({
- error: {
- message: 'Failed to retrieve messages',
- code: 'SERVER_ERROR',
- },
- });
- }
- });
- /**
- * POST /channels/:channelId/messages - Send message
- */
- fastify.post('/channels/:channelId/messages', {
- preHandler: [middleware_1.authenticate, middleware_1.requireChannelAccess],
- schema: {
- params: typebox_1.Type.Object({
- channelId: validation_1.UUIDSchema,
- }),
- body: SendMessageSchema,
- response: {
- 201: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: MessageResponseSchema,
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const { channelId } = request.params;
- const messageData = {
- ...request.body,
- channel_id: channelId,
- user_id: request.user.userId,
- message_type: request.body.message_type || 'text',
- attachments: request.body.attachments || [],
- mentions: request.body.mentions || [],
- metadata: request.body.metadata || {},
- ai_generated: false,
- };
- const message = await messageService.createMessage(messageData);
- // Update channel activity
- await index_1.channelRepository.updateActivity(channelId);
- // Determine if this is a thread message
- const isThreadReply = message.reply_to && message.thread_root;
- // Broadcast message to channel members with thread context
- await utils_1.WebSocketUtils.sendToChannel(channelId, 'message_sent', {
- type: 'message_sent',
- channelId,
- messageId: message.id,
- isThreadReply,
- threadRoot: message.thread_root,
- replyTo: message.reply_to,
- message: {
- id: message.id,
- channel_id: message.channel_id,
- user_id: message.user_id,
- user_name: request.user.name,
- user_email: request.user.email,
- user_avatar: request.user.avatar_url,
- user_role: request.user.role,
- content: message.content,
- message_type: message.message_type,
- voice_data: message.voice_data,
- transcription: message.transcription,
- attachments: message.attachments,
- reply_to: message.reply_to,
- thread_root: message.thread_root,
- is_edited: message.is_edited,
- is_pinned: message.is_pinned,
- is_announcement: message.is_announcement,
- reactions: message.reactions,
- mentions: message.mentions,
- ai_generated: message.ai_generated,
- ai_context: message.ai_context,
- command_execution_id: message.command_execution_id,
- metadata: message.metadata,
- formatting: message.formatting,
- created_at: message.created_at,
- updated_at: message.updated_at,
- edited_at: message.edited_at,
- },
- userId: request.user.userId,
- userName: request.user.name,
- userRole: request.user.role,
- timestamp: new Date().toISOString(),
- });
- // If this is a thread reply, also send a separate thread-specific event
- if (isThreadReply) {
- await utils_1.WebSocketUtils.sendToChannel(channelId, 'thread_reply_sent', {
- type: 'thread_reply_sent',
- channelId,
- threadRoot: message.thread_root,
- parentMessageId: message.reply_to,
- messageId: message.id,
- message: {
- id: message.id,
- channel_id: message.channel_id,
- user_id: message.user_id,
- user_name: request.user.name,
- user_email: request.user.email,
- user_avatar: request.user.avatar_url,
- user_role: request.user.role,
- content: message.content,
- message_type: message.message_type,
- voice_data: message.voice_data,
- transcription: message.transcription,
- attachments: message.attachments,
- reply_to: message.reply_to,
- thread_root: message.thread_root,
- is_edited: message.is_edited,
- is_pinned: message.is_pinned,
- is_announcement: message.is_announcement,
- reactions: message.reactions,
- mentions: message.mentions,
- ai_generated: message.ai_generated,
- ai_context: message.ai_context,
- command_execution_id: message.command_execution_id,
- metadata: message.metadata,
- formatting: message.formatting,
- created_at: message.created_at,
- updated_at: message.updated_at,
- edited_at: message.edited_at,
- },
- userId: request.user.userId,
- userName: request.user.name,
- userRole: request.user.role,
- timestamp: new Date().toISOString(),
- });
- }
- // Send mention notifications
- if (message.mentions.length > 0) {
- for (const mentionedUserId of message.mentions) {
- if (mentionedUserId !== request.user.userId) {
- await utils_1.WebSocketUtils.createAndSendNotification(mentionedUserId, {
- title: 'You were mentioned',
- message: `${request.user.name} mentioned you in ${channelId}`,
- category: 'mention',
- priority: 'medium',
- actionUrl: `/channels/${channelId}`,
- actionText: 'View Message',
- data: {
- channelId,
- messageId: message.id,
- mentionedBy: request.user.userId,
- },
- });
- }
- }
- }
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- channelId,
- messageId: message.id,
- messageType: message.message_type,
- mentionsCount: message.mentions.length,
- attachmentsCount: message.attachments.length,
- }, 'Message sent successfully');
- reply.code(201).send({
- success: true,
- data: message,
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to send message');
- if (error instanceof errors_1.ValidationError) {
- reply.code(400).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to send message',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * PUT /channels/:channelId/messages/:messageId - Edit message
- */
- fastify.put('/channels/:channelId/messages/:messageId', {
- preHandler: [middleware_1.authenticate, middleware_1.requireChannelAccess],
- schema: {
- params: typebox_1.Type.Object({
- channelId: validation_1.UUIDSchema,
- messageId: validation_1.UUIDSchema,
- }),
- body: UpdateMessageSchema,
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: MessageResponseSchema,
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const { channelId, messageId } = request.params;
- const { content } = request.body;
- // Check if user can edit this message
- const existingMessage = await index_1.messageRepository.findById(messageId);
- if (!existingMessage) {
- throw new errors_1.NotFoundError('Message not found');
- }
- if (existingMessage.user_id !== request.user.userId && request.user.role !== 'ceo') {
- throw new errors_1.AuthorizationError('You can only edit your own messages');
- }
- // Check if message is too old to edit (24 hours)
- const messageAge = Date.now() - new Date(existingMessage.created_at).getTime();
- const twentyFourHours = 24 * 60 * 60 * 1000;
- if (messageAge > twentyFourHours && request.user.role !== 'ceo') {
- throw new errors_1.AuthorizationError('Messages older than 24 hours cannot be edited');
- }
- const message = await messageService.updateMessage(messageId, {
- content,
- is_edited: true,
- edited_at: new Date(),
- });
- // Broadcast message edit
- await utils_1.WebSocketUtils.sendToChannel(channelId, 'message_updated', {
- type: 'message_updated',
- channelId,
- messageId,
- message: message,
- userId: request.user.userId,
- userName: request.user.name,
- userRole: request.user.role,
- timestamp: new Date().toISOString(),
- });
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- channelId,
- messageId,
- }, 'Message edited successfully');
- reply.send({
- success: true,
- data: message,
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to edit message');
- if (error instanceof errors_1.NotFoundError || error instanceof errors_1.AuthorizationError) {
- reply.code(error.statusCode).send((0, errors_1.formatErrorResponse)(error));
- }
- else if (error instanceof errors_1.ValidationError) {
- reply.code(400).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to edit message',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * DELETE /channels/:channelId/messages/:messageId - Delete message
- */
- fastify.delete('/channels/:channelId/messages/:messageId', {
- preHandler: [middleware_1.authenticate, middleware_1.requireChannelAccess],
- schema: {
- params: typebox_1.Type.Object({
- channelId: validation_1.UUIDSchema,
- messageId: validation_1.UUIDSchema,
- }),
- response: {
- 200: validation_1.SuccessResponseSchema,
- },
- },
- }, async (request, reply) => {
- try {
- const { channelId, messageId } = request.params;
- // Check if user can delete this message
- const existingMessage = await index_1.messageRepository.findById(messageId);
- if (!existingMessage) {
- throw new errors_1.NotFoundError('Message not found');
- }
- const canDelete = existingMessage.user_id === request.user.userId ||
- request.user.role === 'ceo';
- if (!canDelete) {
- throw new errors_1.AuthorizationError('You can only delete your own messages');
- }
- const success = await index_1.messageRepository.softDelete(messageId, request.user.userId);
- if (!success) {
- throw new errors_1.NotFoundError('Message not found');
- }
- // Clear message cache
- await CacheService_1.cacheService.messages.delete(cache_decorators_1.CacheKeyUtils.messageKey(messageId));
- // Broadcast message deletion
- await utils_1.WebSocketUtils.sendToChannel(channelId, 'message_deleted', {
- type: 'message_deleted',
- channelId,
- messageId,
- userId: request.user.userId,
- userName: request.user.name,
- userRole: request.user.role,
- timestamp: new Date().toISOString(),
- });
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- channelId,
- messageId,
- }, 'Message deleted successfully');
- reply.send({
- success: true,
- message: 'Message deleted successfully',
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to delete message');
- if (error instanceof errors_1.NotFoundError || error instanceof errors_1.AuthorizationError) {
- reply.code(error.statusCode).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to delete message',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * POST /channels/:channelId/messages/:messageId/reactions - Add reaction
- */
- fastify.post('/channels/:channelId/messages/:messageId/reactions', {
- preHandler: [middleware_1.authenticate, middleware_1.requireChannelAccess],
- schema: {
- params: typebox_1.Type.Object({
- channelId: validation_1.UUIDSchema,
- messageId: validation_1.UUIDSchema,
- }),
- body: typebox_1.Type.Object({
- emoji: typebox_1.Type.String({ minLength: 1, maxLength: 10 }),
- }),
- response: {
- 200: validation_1.SuccessResponseSchema,
- },
- },
- }, async (request, reply) => {
- try {
- const { channelId, messageId } = request.params;
- const { emoji } = request.body;
- const success = await index_1.messageRepository.addReaction(messageId, request.user.userId, emoji);
- if (!success) {
- throw new errors_1.NotFoundError('Message not found');
- }
- // Broadcast reaction
- await utils_1.WebSocketUtils.sendToChannel(channelId, 'message_reaction_added', {
- type: 'message_reaction_added',
- channelId,
- messageId,
- emoji,
- userId: request.user.userId,
- userName: request.user.name,
- userRole: request.user.role,
- timestamp: new Date().toISOString(),
- });
- reply.send({
- success: true,
- message: 'Reaction added successfully',
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- logger_1.loggers.api.error({ error }, 'Failed to add reaction');
- if (error instanceof errors_1.NotFoundError) {
- reply.code(404).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to add reaction',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * GET /channels/:channelId/messages/:messageId/thread - Get thread messages
- */
- fastify.get('/channels/:channelId/messages/:messageId/thread', {
- preHandler: [middleware_1.authenticate, middleware_1.requireChannelAccess, middleware_1.apiRateLimit],
- schema: {
- params: typebox_1.Type.Object({
- channelId: validation_1.UUIDSchema,
- messageId: validation_1.UUIDSchema,
- }),
- querystring: validation_1.PaginationSchema,
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: typebox_1.Type.Object({
- parentMessage: MessageResponseSchema,
- replies: typebox_1.Type.Array(MessageResponseSchema),
- pagination: typebox_1.Type.Object({
- total: typebox_1.Type.Integer(),
- limit: typebox_1.Type.Integer(),
- offset: typebox_1.Type.Integer(),
- hasMore: typebox_1.Type.Boolean(),
- }),
- }),
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const { channelId, messageId } = request.params;
- const { limit = 50, offset = 0 } = request.query;
- // Get the parent message
- const parentMessage = await index_1.messageRepository.findById(messageId);
- if (!parentMessage) {
- throw new errors_1.NotFoundError('Message not found');
- }
- // Get thread root - if this message is itself a reply, get its root
- const threadRoot = parentMessage.thread_root || messageId;
- // Get all replies to this thread
- const replies = await index_1.messageRepository.findChannelMessages(channelId, { threadRoot }, Math.min(limit, 100), offset);
- // Filter out the parent message from replies if it's included
- const threadReplies = replies.filter(msg => msg.id !== threadRoot);
- const total = await index_1.messageRepository.getChannelMessageCount(channelId, { threadRoot });
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- channelId,
- messageId,
- threadRoot,
- repliesCount: threadReplies.length,
- }, 'Thread messages retrieved');
- reply.send({
- success: true,
- data: {
- parentMessage,
- replies: threadReplies,
- pagination: {
- total: total - 1, // Exclude parent message from count
- limit,
- offset,
- hasMore: offset + limit < total - 1,
- },
- },
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to retrieve thread messages');
- if (error instanceof errors_1.NotFoundError) {
- reply.code(404).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to retrieve thread messages',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * POST /channels/:channelId/messages/:messageId/pin - Pin/Unpin message
- */
- fastify.post('/channels/:channelId/messages/:messageId/pin', {
- preHandler: [middleware_1.authenticate, middleware_1.requireChannelAccess],
- schema: {
- params: typebox_1.Type.Object({
- channelId: validation_1.UUIDSchema,
- messageId: validation_1.UUIDSchema,
- }),
- body: typebox_1.Type.Object({
- pinned: typebox_1.Type.Boolean(),
- }),
- response: {
- 200: validation_1.SuccessResponseSchema,
- },
- },
- }, async (request, reply) => {
- try {
- const { channelId, messageId } = request.params;
- const { pinned } = request.body;
- // Only channel admins/owners and CEO can pin messages
- // This would need channel member role checking
- if (request.user.role !== 'ceo') {
- throw new errors_1.AuthorizationError('Only channel administrators can pin messages');
- }
- const success = await index_1.messageRepository.updateMessage(messageId, {
- is_pinned: pinned,
- });
- if (!success) {
- throw new errors_1.NotFoundError('Message not found');
- }
- // Broadcast pin status change
- await utils_1.WebSocketUtils.sendToChannel(channelId, 'message_pinned', {
- type: pinned ? 'message_pinned' : 'message_unpinned',
- channelId,
- messageId,
- pinned,
- userId: request.user.userId,
- userName: request.user.name,
- userRole: request.user.role,
- timestamp: new Date().toISOString(),
- });
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- channelId,
- messageId,
- pinned,
- }, `Message ${pinned ? 'pinned' : 'unpinned'} successfully`);
- reply.send({
- success: true,
- message: `Message ${pinned ? 'pinned' : 'unpinned'} successfully`,
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to update message pin status');
- if (error instanceof errors_1.NotFoundError || error instanceof errors_1.AuthorizationError) {
- reply.code(error.statusCode).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to update pin status',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
-};
-exports.registerMessageRoutes = registerMessageRoutes;
-//# sourceMappingURL=MessageRoutes.js.map
\ No newline at end of file
diff --git a/backend/dist/api/routes/MessageRoutes.js.map b/backend/dist/api/routes/MessageRoutes.js.map
deleted file mode 100644
index 2bc839b..0000000
--- a/backend/dist/api/routes/MessageRoutes.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"MessageRoutes.js","sourceRoot":"","sources":["../../../src/api/routes/MessageRoutes.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/api/routes/NotificationRoutes.d.ts b/backend/dist/api/routes/NotificationRoutes.d.ts
deleted file mode 100644
index e38f1e8..0000000
--- a/backend/dist/api/routes/NotificationRoutes.d.ts
+++ /dev/null
@@ -1,3 +0,0 @@
-import { FastifyInstance } from 'fastify';
-export declare function notificationRoutes(fastify: FastifyInstance): Promise;
-//# sourceMappingURL=NotificationRoutes.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/api/routes/NotificationRoutes.d.ts.map b/backend/dist/api/routes/NotificationRoutes.d.ts.map
deleted file mode 100644
index 8d5cbcd..0000000
--- a/backend/dist/api/routes/NotificationRoutes.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"NotificationRoutes.d.ts","sourceRoot":"","sources":["../../../src/api/routes/NotificationRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAwBxE,wBAAsB,kBAAkB,CAAC,OAAO,EAAE,eAAe,iBAyUhE"}
\ No newline at end of file
diff --git a/backend/dist/api/routes/NotificationRoutes.js b/backend/dist/api/routes/NotificationRoutes.js
deleted file mode 100644
index a0d0ea2..0000000
--- a/backend/dist/api/routes/NotificationRoutes.js
+++ /dev/null
@@ -1,274 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.notificationRoutes = notificationRoutes;
-const typebox_1 = require("@sinclair/typebox");
-const index_1 = require("@db/index");
-const logger_1 = require("@utils/logger");
-const errors_1 = require("@utils/errors");
-const utils_1 = require("@websocket/utils");
-// Schema definitions
-const ChannelNotificationSchema = typebox_1.Type.Object({
- channelId: typebox_1.Type.String(),
- senderId: typebox_1.Type.String(),
- senderName: typebox_1.Type.String(),
- message: typebox_1.Type.String(),
- type: typebox_1.Type.Union([typebox_1.Type.Literal('new_message'), typebox_1.Type.Literal('thread_reply')]),
- parentMessageId: typebox_1.Type.Optional(typebox_1.Type.String()),
-});
-async function notificationRoutes(fastify) {
- /**
- * POST /notifications/channel - Send push notifications to channel members
- */
- fastify.post('/notifications/channel', {
- preHandler: [fastify.authenticate],
- schema: {
- tags: ['Notifications'],
- summary: 'Send Channel Notification',
- description: 'Send push notifications to all channel members except the sender',
- body: ChannelNotificationSchema,
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- message: typebox_1.Type.String(),
- notificationsSent: typebox_1.Type.Number(),
- }),
- 400: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String(),
- }),
- }),
- 500: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String(),
- }),
- }),
- },
- },
- }, async (request, reply) => {
- const { channelId, senderId, senderName, message, type, parentMessageId } = request.body;
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.userId,
- email: request.user.email ?? '',
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- try {
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- channelId,
- type,
- messageLength: message.length,
- }, 'Sending channel notification');
- // Get channel members (excluding the sender)
- const members = await index_1.channelRepository.getMembers(channelId);
- const recipientMembers = members.filter(member => member.user_id !== senderId);
- if (recipientMembers.length === 0) {
- return reply.send({
- success: true,
- message: 'No recipients to notify',
- notificationsSent: 0,
- });
- }
- // Prepare notification data
- const notificationTitle = type === 'thread_reply'
- ? `${senderName} replied in thread`
- : `New message in channel`;
- const notificationBody = message.length > 100
- ? `${message.substring(0, 97)}...`
- : message;
- // Send notifications via WebSocket (which can trigger push notifications)
- let notificationsSent = 0;
- for (const member of recipientMembers) {
- try {
- // Send WebSocket notification
- await utils_1.WebSocketUtils.createAndSendNotification(member.user_id, {
- title: notificationTitle,
- message: notificationBody,
- category: 'channel',
- priority: 'medium',
- data: {
- channelId,
- senderId,
- senderName,
- messageId: parentMessageId || 'new',
- type,
- },
- });
- notificationsSent++;
- }
- catch (error) {
- logger_1.loggers.api.warn({ error, userId: member.user_id, channelId }, 'Failed to send notification to user');
- }
- }
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- channelId,
- type,
- notificationsSent,
- totalRecipients: recipientMembers.length,
- }, 'Channel notifications sent successfully');
- reply.send({
- success: true,
- message: 'Notifications sent successfully',
- notificationsSent,
- });
- }
- catch (error) {
- logger_1.loggers.api.error({ error, context }, 'Failed to send channel notifications');
- const notificationError = new errors_1.ExternalServiceError('Failed to send notifications', 'notification-service', error);
- reply.code(502).send((0, errors_1.formatErrorResponse)(notificationError));
- }
- });
- /**
- * POST /notifications/register - Register device token for push notifications
- */
- fastify.post('/notifications/register', {
- preHandler: [fastify.authenticate],
- schema: {
- tags: ['Notifications'],
- summary: 'Register Device Token',
- description: 'Register device token for push notifications',
- body: typebox_1.Type.Object({
- token: typebox_1.Type.String(),
- platform: typebox_1.Type.Union([typebox_1.Type.Literal('ios'), typebox_1.Type.Literal('android')]),
- deviceInfo: typebox_1.Type.Optional(typebox_1.Type.Object({
- brand: typebox_1.Type.Optional(typebox_1.Type.String()),
- modelName: typebox_1.Type.Optional(typebox_1.Type.String()),
- osName: typebox_1.Type.Optional(typebox_1.Type.String()),
- osVersion: typebox_1.Type.Optional(typebox_1.Type.String()),
- })),
- }),
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- message: typebox_1.Type.String(),
- }),
- },
- },
- }, async (request, reply) => {
- const { token, platform, deviceInfo } = request.body;
- try {
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- platform,
- deviceInfo,
- }, 'Registering device token');
- // Here you would typically save the token to your database
- // associated with the user for later use in push notifications
- // For now, just log it as this would require a device_tokens table
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- tokenLength: token.length,
- platform,
- }, 'Device token registered (not persisted - requires device_tokens table)');
- reply.send({
- success: true,
- message: 'Device token registered successfully',
- });
- }
- catch (error) {
- logger_1.loggers.api.error({ error, userId: request.user?.userId }, 'Failed to register device token');
- const tokenError = new errors_1.ExternalServiceError('Failed to register device token', 'notification-service', error);
- reply.code(502).send((0, errors_1.formatErrorResponse)(tokenError));
- }
- });
- /**
- * PUT /notifications/preferences - Update notification preferences
- */
- fastify.put('/notifications/preferences', {
- preHandler: [fastify.authenticate],
- schema: {
- tags: ['Notifications'],
- summary: 'Update Notification Preferences',
- description: 'Update user notification preferences',
- body: typebox_1.Type.Object({
- taskNotifications: typebox_1.Type.Boolean(),
- mentionNotifications: typebox_1.Type.Boolean(),
- channelNotifications: typebox_1.Type.Boolean(),
- quietHoursEnabled: typebox_1.Type.Boolean(),
- quietHoursStart: typebox_1.Type.Optional(typebox_1.Type.String()),
- quietHoursEnd: typebox_1.Type.Optional(typebox_1.Type.String()),
- }),
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- message: typebox_1.Type.String(),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- preferences: request.body,
- }, 'Updating notification preferences');
- // Here you would update the user's notification preferences in the database
- // This would require a user_notification_preferences table or additional columns
- reply.send({
- success: true,
- message: 'Notification preferences updated successfully',
- });
- }
- catch (error) {
- logger_1.loggers.api.error({ error, userId: request.user?.userId }, 'Failed to update notification preferences');
- const prefsError = new errors_1.ExternalServiceError('Failed to update notification preferences', 'preferences-service', error);
- reply.code(502).send((0, errors_1.formatErrorResponse)(prefsError));
- }
- });
- /**
- * GET /notifications/preferences - Get notification preferences
- */
- fastify.get('/notifications/preferences', {
- preHandler: [fastify.authenticate],
- schema: {
- tags: ['Notifications'],
- summary: 'Get Notification Preferences',
- description: 'Get user notification preferences',
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: typebox_1.Type.Object({
- taskNotifications: typebox_1.Type.Boolean(),
- mentionNotifications: typebox_1.Type.Boolean(),
- channelNotifications: typebox_1.Type.Boolean(),
- quietHoursEnabled: typebox_1.Type.Boolean(),
- quietHoursStart: typebox_1.Type.Optional(typebox_1.Type.String()),
- quietHoursEnd: typebox_1.Type.Optional(typebox_1.Type.String()),
- }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- // Return default preferences for now
- // In a real implementation, you'd fetch these from the database
- const defaultPreferences = {
- taskNotifications: true,
- mentionNotifications: true,
- channelNotifications: true,
- quietHoursEnabled: false,
- quietHoursStart: '22:00',
- quietHoursEnd: '08:00',
- };
- reply.send({
- success: true,
- data: defaultPreferences,
- });
- }
- catch (error) {
- logger_1.loggers.api.error({ error, userId: request.user?.userId }, 'Failed to get notification preferences');
- const getPrefsError = new errors_1.ExternalServiceError('Failed to get notification preferences', 'preferences-service', error);
- reply.code(502).send((0, errors_1.formatErrorResponse)(getPrefsError));
- }
- });
-}
-//# sourceMappingURL=NotificationRoutes.js.map
\ No newline at end of file
diff --git a/backend/dist/api/routes/NotificationRoutes.js.map b/backend/dist/api/routes/NotificationRoutes.js.map
deleted file mode 100644
index 7dbfdca..0000000
--- a/backend/dist/api/routes/NotificationRoutes.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"NotificationRoutes.js","sourceRoot":"","sources":["../../../src/api/routes/NotificationRoutes.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/api/routes/TaskRoutes.d.ts b/backend/dist/api/routes/TaskRoutes.d.ts
deleted file mode 100644
index 62ca1a5..0000000
--- a/backend/dist/api/routes/TaskRoutes.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { FastifyInstance } from 'fastify';
-/**
- * Register task routes
- */
-export declare const registerTaskRoutes: (fastify: FastifyInstance) => Promise;
-//# sourceMappingURL=TaskRoutes.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/api/routes/TaskRoutes.d.ts.map b/backend/dist/api/routes/TaskRoutes.d.ts.map
deleted file mode 100644
index d633ec8..0000000
--- a/backend/dist/api/routes/TaskRoutes.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"TaskRoutes.d.ts","sourceRoot":"","sources":["../../../src/api/routes/TaskRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AAyJxE;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAU,SAAS,eAAe,kBA69ChE,CAAC"}
\ No newline at end of file
diff --git a/backend/dist/api/routes/TaskRoutes.js b/backend/dist/api/routes/TaskRoutes.js
deleted file mode 100644
index ef114b7..0000000
--- a/backend/dist/api/routes/TaskRoutes.js
+++ /dev/null
@@ -1,1438 +0,0 @@
-"use strict";
-var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
-};
-var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.registerTaskRoutes = void 0;
-const typebox_1 = require("@sinclair/typebox");
-const index_1 = require("@db/index");
-const logger_1 = require("@utils/logger");
-const errors_1 = require("@utils/errors");
-const middleware_1 = require("@auth/middleware");
-const CacheService_1 = require("../../services/CacheService");
-const cache_decorators_1 = require("@utils/cache-decorators");
-const utils_1 = require("@websocket/utils");
-const validation_1 = require("@utils/validation");
-/**
- * Task Management API Routes
- * Enterprise-grade task CRUD operations with real-time updates
- */
-// Request/Response Schemas
-const CreateTaskSchema = typebox_1.Type.Object({
- title: typebox_1.Type.String({ minLength: 1, maxLength: 255 }),
- description: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 2000 })),
- channel_id: typebox_1.Type.Optional(validation_1.UUIDSchema),
- parent_task_id: typebox_1.Type.Optional(validation_1.UUIDSchema),
- assigned_to: typebox_1.Type.Optional(typebox_1.Type.Array(validation_1.UUIDSchema)),
- owned_by: typebox_1.Type.Optional(validation_1.UUIDSchema),
- priority: typebox_1.Type.Optional(validation_1.TaskPrioritySchema),
- task_type: typebox_1.Type.Optional(typebox_1.Type.Union([
- typebox_1.Type.Literal('general'),
- typebox_1.Type.Literal('project'),
- typebox_1.Type.Literal('maintenance'),
- typebox_1.Type.Literal('emergency'),
- typebox_1.Type.Literal('research'),
- typebox_1.Type.Literal('approval'),
- ])),
- complexity: typebox_1.Type.Optional(typebox_1.Type.Integer({ minimum: 1, maximum: 10 })),
- estimated_hours: typebox_1.Type.Optional(typebox_1.Type.Number({ minimum: 0 })),
- due_date: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'date-time' })),
- start_date: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'date-time' })),
- tags: typebox_1.Type.Optional(typebox_1.Type.Array(typebox_1.Type.String({ maxLength: 50 }))),
- labels: typebox_1.Type.Optional(typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.Any())),
- voice_created: typebox_1.Type.Optional(typebox_1.Type.Boolean()),
- voice_command_id: typebox_1.Type.Optional(typebox_1.Type.String()),
- voice_instructions: typebox_1.Type.Optional(typebox_1.Type.String()),
- business_value: typebox_1.Type.Optional(validation_1.BusinessValueSchema),
- acceptance_criteria: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 2000 })),
-});
-const UpdateTaskSchema = typebox_1.Type.Object({
- title: typebox_1.Type.Optional(typebox_1.Type.String({ minLength: 1, maxLength: 255 })),
- description: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 2000 })),
- priority: typebox_1.Type.Optional(validation_1.TaskPrioritySchema),
- status: typebox_1.Type.Optional(validation_1.TaskStatusSchema),
- complexity: typebox_1.Type.Optional(typebox_1.Type.Integer({ minimum: 1, maximum: 10 })),
- estimated_hours: typebox_1.Type.Optional(typebox_1.Type.Number({ minimum: 0 })),
- due_date: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'date-time' })),
- start_date: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'date-time' })),
- tags: typebox_1.Type.Optional(typebox_1.Type.Array(typebox_1.Type.String({ maxLength: 50 }))),
- labels: typebox_1.Type.Optional(typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.Any())),
- business_value: typebox_1.Type.Optional(validation_1.BusinessValueSchema),
- acceptance_criteria: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 2000 })),
-});
-const TaskResponseSchema = typebox_1.Type.Object({
- id: validation_1.UUIDSchema,
- title: typebox_1.Type.String(),
- description: typebox_1.Type.Optional(typebox_1.Type.String()),
- channel_id: typebox_1.Type.Optional(validation_1.UUIDSchema),
- parent_task_id: typebox_1.Type.Optional(validation_1.UUIDSchema),
- created_by: validation_1.UUIDSchema,
- assigned_to: typebox_1.Type.Array(validation_1.UUIDSchema),
- owned_by: typebox_1.Type.Optional(validation_1.UUIDSchema),
- priority: validation_1.TaskPrioritySchema,
- status: validation_1.TaskStatusSchema,
- task_type: typebox_1.Type.String(),
- complexity: typebox_1.Type.Integer(),
- estimated_hours: typebox_1.Type.Optional(typebox_1.Type.Number()),
- actual_hours: typebox_1.Type.Number(),
- story_points: typebox_1.Type.Optional(typebox_1.Type.Integer()),
- due_date: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'date-time' })),
- start_date: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'date-time' })),
- completed_at: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'date-time' })),
- progress_percentage: typebox_1.Type.Integer(),
- tags: typebox_1.Type.Array(typebox_1.Type.String()),
- labels: typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.Any()),
- voice_created: typebox_1.Type.Boolean(),
- voice_command_id: typebox_1.Type.Optional(typebox_1.Type.String()),
- voice_instructions: typebox_1.Type.Optional(typebox_1.Type.String()),
- business_value: validation_1.BusinessValueSchema,
- acceptance_criteria: typebox_1.Type.Optional(typebox_1.Type.String()),
- watchers: typebox_1.Type.Array(validation_1.UUIDSchema),
- comments_count: typebox_1.Type.Integer(),
- attachments_count: typebox_1.Type.Integer(),
- created_at: typebox_1.Type.String({ format: 'date-time' }),
- updated_at: typebox_1.Type.String({ format: 'date-time' }),
- last_activity_at: typebox_1.Type.String({ format: 'date-time' }),
-});
-const TaskStatsSchema = typebox_1.Type.Object({
- totalTasks: typebox_1.Type.Integer(),
- tasksByStatus: typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.Integer()),
- tasksByPriority: typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.Integer()),
- overdueTasks: typebox_1.Type.Integer(),
- completedThisWeek: typebox_1.Type.Integer(),
- averageCompletionTime: typebox_1.Type.Number(),
-});
-/**
- * Task service with caching
- */
-class TaskService {
- async getTaskById(taskId) {
- return await index_1.taskRepository.findById(taskId);
- }
- async updateTask(taskId, updateData) {
- return await index_1.taskRepository.update(taskId, updateData);
- }
- async createTask(taskData) {
- return await index_1.taskRepository.createTask(taskData);
- }
-}
-__decorate([
- (0, cache_decorators_1.Cacheable)({
- ttl: 900, // 15 minutes
- namespace: 'tasks',
- keyGenerator: (taskId) => cache_decorators_1.CacheKeyUtils.taskKey(taskId),
- }),
- __metadata("design:type", Function),
- __metadata("design:paramtypes", [String]),
- __metadata("design:returntype", Promise)
-], TaskService.prototype, "getTaskById", null);
-__decorate([
- (0, cache_decorators_1.CacheEvict)({
- keys: (taskId) => [cache_decorators_1.CacheKeyUtils.taskKey(taskId)],
- namespace: 'tasks',
- tags: ['tasks'],
- }),
- __metadata("design:type", Function),
- __metadata("design:paramtypes", [String, Object]),
- __metadata("design:returntype", Promise)
-], TaskService.prototype, "updateTask", null);
-__decorate([
- (0, cache_decorators_1.CacheEvict)({
- allEntries: true,
- namespace: 'tasks',
- }),
- __metadata("design:type", Function),
- __metadata("design:paramtypes", [Object]),
- __metadata("design:returntype", Promise)
-], TaskService.prototype, "createTask", null);
-const taskService = new TaskService();
-/**
- * Register task routes
- */
-const registerTaskRoutes = async (fastify) => {
- /**
- * GET /tasks - List tasks with filters
- */
- fastify.get('/tasks', {
- preHandler: [middleware_1.authenticate, middleware_1.apiRateLimit],
- schema: {
- querystring: typebox_1.Type.Intersect([
- validation_1.PaginationSchema,
- typebox_1.Type.Object({
- status: typebox_1.Type.Optional(typebox_1.Type.Array(validation_1.TaskStatusSchema)),
- priority: typebox_1.Type.Optional(typebox_1.Type.Array(validation_1.TaskPrioritySchema)),
- assigned_to: typebox_1.Type.Optional(validation_1.UUIDSchema),
- channel_id: typebox_1.Type.Optional(validation_1.UUIDSchema),
- created_by: typebox_1.Type.Optional(validation_1.UUIDSchema),
- due_after: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'date-time' })),
- due_before: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'date-time' })),
- tags: typebox_1.Type.Optional(typebox_1.Type.Array(typebox_1.Type.String())),
- overdue: typebox_1.Type.Optional(typebox_1.Type.Boolean()),
- voice_created: typebox_1.Type.Optional(typebox_1.Type.Boolean()),
- search: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 200 })),
- }),
- ]),
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: typebox_1.Type.Array(TaskResponseSchema),
- pagination: typebox_1.Type.Object({
- total: typebox_1.Type.Integer(),
- limit: typebox_1.Type.Integer(),
- offset: typebox_1.Type.Integer(),
- hasMore: typebox_1.Type.Boolean(),
- }),
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const { limit = 20, offset = 0, status, priority, assigned_to, channel_id, created_by, due_after, due_before, tags, overdue, voice_created, search, } = request.query;
- // Debug logging for filter parameters
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- queryParams: {
- limit,
- offset,
- status: Array.isArray(status) ? status : [status],
- priority: Array.isArray(priority) ? priority : [priority],
- assigned_to,
- channel_id,
- created_by,
- due_after,
- due_before,
- tags,
- overdue,
- voice_created,
- search,
- }
- }, 'Task filter request received');
- // Build task filters
- const filters = {};
- if (status) {
- filters.status = Array.isArray(status) ? status : [status];
- }
- if (priority) {
- filters.priority = Array.isArray(priority) ? priority : [priority];
- }
- if (assigned_to)
- filters.assignedTo = [assigned_to];
- if (channel_id)
- filters.channelId = channel_id;
- if (due_after)
- filters.dueAfter = new Date(due_after);
- if (due_before)
- filters.dueBefore = new Date(due_before);
- if (tags) {
- filters.tags = Array.isArray(tags) ? tags : [tags];
- }
- if (overdue !== undefined)
- filters.overdue = overdue;
- if (voice_created !== undefined)
- filters.voiceCreated = voice_created;
- // Filter based on user permissions (non-CEO users only see their tasks unless specified)
- if (request.user.role !== 'ceo' && !assigned_to && !created_by) {
- filters.assignedTo = [request.user.userId];
- }
- let tasks = [];
- let total = 0;
- if (search) {
- // Use search functionality
- tasks = await index_1.taskRepository.searchTasks(search, request.user.userId, Math.min(limit, 100), offset);
- total = tasks.length; // Approximation for search results
- }
- else {
- // Use filtered query
- tasks = await index_1.taskRepository.findWithFilters(filters, Math.min(limit, 100), offset);
- // TODO: Get total count for pagination
- total = tasks.length;
- }
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- filters,
- search,
- resultCount: tasks.length,
- }, 'Tasks list retrieved');
- reply.send({
- success: true,
- data: tasks,
- pagination: {
- total,
- limit,
- offset,
- hasMore: offset + limit < total,
- },
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.userId,
- email: request.user.email ?? '',
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- // Enhanced error logging
- logger_1.loggers.api.error({
- error: {
- message: error instanceof Error ? error.message : String(error),
- stack: error instanceof Error ? error.stack : undefined,
- name: error instanceof Error ? error.name : undefined,
- },
- context,
- queryParams: request.query,
- }, 'Failed to retrieve tasks - detailed error');
- reply.code(500).send({
- error: {
- message: 'Failed to retrieve tasks',
- code: 'SERVER_ERROR',
- details: error instanceof Error ? error.message : String(error),
- },
- });
- }
- });
- /**
- * GET /tasks/:id - Get task details
- */
- fastify.get('/tasks/:id', {
- preHandler: [middleware_1.authenticate],
- schema: {
- params: typebox_1.Type.Object({
- id: validation_1.UUIDSchema,
- }),
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: TaskResponseSchema,
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const { id } = request.params;
- const task = await taskService.getTaskById(id);
- if (!task) {
- throw new errors_1.NotFoundError('Task not found');
- }
- // Check if user has access to this task
- const hasAccess = request.user.role === 'ceo' ||
- task.assigned_to.includes(request.user.userId) ||
- task.created_by === request.user.userId ||
- task.watchers.includes(request.user.userId);
- if (!hasAccess) {
- throw new errors_1.AuthorizationError('You do not have access to this task');
- }
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- taskId: id,
- }, 'Task details retrieved');
- reply.send({
- success: true,
- data: task,
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.userId,
- email: request.user.email ?? '',
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to retrieve task');
- if (error instanceof errors_1.NotFoundError || error instanceof errors_1.AuthorizationError) {
- reply.code(error.statusCode).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to retrieve task',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * POST /tasks - Create new task
- */
- fastify.post('/tasks', {
- preHandler: [middleware_1.authenticate, (0, middleware_1.authorize)('tasks:create')],
- schema: {
- body: CreateTaskSchema,
- response: {
- 201: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: TaskResponseSchema,
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const taskData = {
- ...request.body,
- created_by: request.user.userId,
- assigned_to: request.body.assigned_to || [request.user.userId],
- owned_by: request.body.owned_by || request.user.userId,
- tags: request.body.tags || [],
- labels: request.body.labels || {},
- due_date: request.body.due_date ? new Date(request.body.due_date) : undefined,
- start_date: request.body.start_date ? new Date(request.body.start_date) : undefined,
- };
- const task = await taskService.createTask(taskData);
- // Create activity for task creation
- try {
- await index_1.activityRepository.createActivity({
- channelId: task.channel_id,
- taskId: task.id,
- userId: request.user.userId,
- activityType: 'task_created',
- title: `Task Created: ${task.title}`,
- description: `New task "${task.title}" was created${task.description ? ': ' + task.description : ''}`,
- priority: task.priority,
- category: 'task',
- metadata: {
- taskId: task.id,
- taskTitle: task.title,
- taskStatus: task.status,
- taskPriority: task.priority,
- assignedTo: task.assigned_to,
- channelId: task.channel_id,
- createdBy: request.user.userId,
- createdByName: request.user.name
- }
- });
- }
- catch (error) {
- logger_1.loggers.api.warn?.({ error, taskId: task.id }, 'Failed to create task creation activity');
- }
- // Broadcast task creation
- await utils_1.WebSocketUtils.broadcastTaskUpdate({
- type: 'task_created',
- taskId: task.id,
- channelId: task.channel_id || '',
- task: {
- id: task.id,
- title: task.title,
- ...(task.description ? { description: task.description } : {}),
- status: task.status,
- priority: task.priority,
- assignedTo: task.assigned_to,
- ...(task.due_date ? { dueDate: task.due_date.toISOString() } : {}),
- progress: task.progress_percentage,
- tags: task.tags,
- },
- action: 'create',
- userId: request.user.userId,
- userName: request.user.name,
- userRole: request.user.role,
- });
- // Send notifications to assignees
- if (task.assigned_to.length > 0) {
- for (const assigneeId of task.assigned_to) {
- if (assigneeId !== request.user.userId) {
- await utils_1.WebSocketUtils.createAndSendNotification(assigneeId, {
- title: 'New Task Assigned',
- message: `You have been assigned to task: ${task.title}`,
- category: 'task',
- priority: task.priority === 'critical' || task.priority === 'urgent' ? 'high' : 'medium',
- actionUrl: `/tasks/${task.id}`,
- actionText: 'View Task',
- data: { taskId: task.id, taskTitle: task.title },
- });
- }
- }
- }
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- taskId: task.id,
- taskTitle: task.title,
- assignedTo: task.assigned_to,
- priority: task.priority,
- }, 'Task created successfully');
- reply.code(201).send({
- success: true,
- data: task,
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.userId,
- email: request.user.email ?? '',
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to create task');
- if (error instanceof errors_1.ValidationError) {
- reply.code(400).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to create task',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * PUT /tasks/:id - Update task
- */
- fastify.put('/tasks/:id', {
- preHandler: [middleware_1.authenticate, (0, middleware_1.authorize)('tasks:update')],
- schema: {
- params: typebox_1.Type.Object({
- id: validation_1.UUIDSchema,
- }),
- body: UpdateTaskSchema,
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: TaskResponseSchema,
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const { id } = request.params;
- const updateData = {
- ...request.body,
- due_date: request.body.due_date ? new Date(request.body.due_date) : undefined,
- start_date: request.body.start_date ? new Date(request.body.start_date) : undefined,
- };
- // Check if user can update this task
- const existingTask = await index_1.taskRepository.findById(id);
- if (!existingTask) {
- throw new errors_1.NotFoundError('Task not found');
- }
- const canUpdate = request.user.role === 'ceo' ||
- existingTask.assigned_to.includes(request.user.userId) ||
- existingTask.created_by === request.user.userId ||
- existingTask.owned_by === request.user.userId;
- if (!canUpdate) {
- throw new errors_1.AuthorizationError('You do not have permission to update this task');
- }
- const task = await taskService.updateTask(id, updateData);
- // Broadcast task update
- await utils_1.WebSocketUtils.broadcastTaskUpdate({
- type: 'task_updated',
- taskId: id,
- channelId: task.channel_id || '',
- task: {
- id: task.id,
- title: task.title,
- ...(task.description ? { description: task.description } : {}),
- status: task.status,
- priority: task.priority,
- assignedTo: task.assigned_to,
- ...(task.due_date ? { dueDate: task.due_date.toISOString() } : {}),
- progress: task.progress_percentage,
- tags: task.tags,
- },
- action: 'update',
- changes: updateData,
- userId: request.user.userId,
- userName: request.user.name,
- userRole: request.user.role,
- });
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- taskId: id,
- updatedFields: Object.keys(updateData),
- }, 'Task updated successfully');
- reply.send({
- success: true,
- data: task,
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.userId,
- email: request.user.email ?? '',
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to update task');
- if (error instanceof errors_1.NotFoundError || error instanceof errors_1.AuthorizationError) {
- reply.code(error.statusCode).send((0, errors_1.formatErrorResponse)(error));
- }
- else if (error instanceof errors_1.ValidationError) {
- reply.code(400).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to update task',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * PATCH /tasks/:id/status - Update task status
- */
- fastify.patch('/tasks/:id/status', {
- preHandler: [middleware_1.authenticate, (0, middleware_1.authorize)('tasks:update')],
- schema: {
- params: typebox_1.Type.Object({
- id: validation_1.UUIDSchema,
- }),
- body: typebox_1.Type.Object({
- status: validation_1.TaskStatusSchema,
- }),
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: TaskResponseSchema,
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const { id } = request.params;
- const { status } = request.body;
- const task = await index_1.taskRepository.updateStatus(id, status, request.user.userId);
- // Create activity for task status update
- try {
- const activityType = status === 'completed' ? 'task_completed' : 'task_updated';
- const activityTitle = status === 'completed'
- ? `Task Completed: ${task.title}`
- : `Task Status Updated: ${task.title}`;
- const activityDescription = status === 'completed'
- ? `Task "${task.title}" was marked as completed`
- : `Task "${task.title}" status was updated to ${status}`;
- await index_1.activityRepository.createActivity({
- channelId: task.channel_id,
- taskId: task.id,
- userId: request.user.userId,
- activityType,
- title: activityTitle,
- description: activityDescription,
- priority: task.priority,
- category: 'task',
- metadata: {
- taskId: task.id,
- taskTitle: task.title,
- oldStatus: status, // Note: we don't have the old status here, but status is the new one
- newStatus: status,
- taskPriority: task.priority,
- assignedTo: task.assigned_to,
- channelId: task.channel_id,
- updatedBy: request.user.userId,
- updatedByName: request.user.name
- }
- });
- }
- catch (error) {
- logger_1.loggers.api.warn?.({ error, taskId: id }, 'Failed to create task status update activity');
- }
- // Broadcast status change
- await utils_1.WebSocketUtils.broadcastTaskUpdate({
- type: status === 'completed' ? 'task_completed' : 'task_updated',
- taskId: id,
- channelId: task.channel_id || '',
- task: {
- id: task.id,
- title: task.title,
- ...(task.description ? { description: task.description } : {}),
- status: task.status,
- priority: task.priority,
- assignedTo: task.assigned_to,
- ...(task.due_date ? { dueDate: task.due_date.toISOString() } : {}),
- progress: task.progress_percentage,
- tags: task.tags,
- },
- action: status === 'completed' ? 'complete' : 'update',
- changes: { status },
- userId: request.user.userId,
- userName: request.user.name,
- userRole: request.user.role,
- });
- // Send completion notification
- if (status === 'completed') {
- for (const assigneeId of task.assigned_to) {
- if (assigneeId !== request.user.userId) {
- await utils_1.WebSocketUtils.createAndSendNotification(assigneeId, {
- title: 'Task Completed',
- message: `Task "${task.title}" has been completed`,
- category: 'task',
- priority: 'medium',
- actionUrl: `/tasks/${task.id}`,
- actionText: 'View Task',
- data: { taskId: task.id, taskTitle: task.title },
- });
- }
- }
- }
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- taskId: id,
- newStatus: status,
- }, 'Task status updated successfully');
- reply.send({
- success: true,
- data: task,
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.userId,
- email: request.user.email ?? '',
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to update task status');
- if (error instanceof errors_1.NotFoundError || error instanceof errors_1.AuthorizationError) {
- reply.code(error.statusCode).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to update task status',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * POST /tasks/:id/assign - Assign users to task
- */
- fastify.post('/tasks/:id/assign', {
- preHandler: [middleware_1.authenticate, (0, middleware_1.authorize)('tasks:assign')],
- schema: {
- params: typebox_1.Type.Object({
- id: validation_1.UUIDSchema,
- }),
- body: typebox_1.Type.Object({
- user_ids: typebox_1.Type.Array(validation_1.UUIDSchema),
- }),
- response: {
- 200: validation_1.SuccessResponseSchema,
- },
- },
- }, async (request, reply) => {
- try {
- const { id } = request.params;
- const { user_ids } = request.body;
- const success = await index_1.taskRepository.assignUsers(id, user_ids, request.user.userId);
- if (!success) {
- throw new errors_1.ValidationError('Failed to assign users to task', []);
- }
- // Clear task cache
- await CacheService_1.cacheService.tasks.delete(cache_decorators_1.CacheKeyUtils.taskKey(id));
- // Get updated task for broadcast
- const task = await index_1.taskRepository.findById(id);
- if (task) {
- // Create activity for task assignment
- try {
- await index_1.activityRepository.createActivity({
- channelId: task.channel_id,
- taskId: task.id,
- userId: request.user.userId,
- activityType: 'task_assigned',
- title: `Task Assigned: ${task.title}`,
- description: `Task "${task.title}" was assigned to ${user_ids.length} user(s)`,
- priority: task.priority,
- category: 'task',
- metadata: {
- taskId: task.id,
- taskTitle: task.title,
- assignedUserIds: user_ids,
- taskPriority: task.priority,
- channelId: task.channel_id,
- assignedBy: request.user.userId,
- assignedByName: request.user.name,
- totalAssignedUsers: task.assigned_to.length
- }
- });
- }
- catch (error) {
- logger_1.loggers.api.warn?.({ error, taskId: id }, 'Failed to create task assignment activity');
- }
- // Broadcast assignment
- await utils_1.WebSocketUtils.broadcastTaskUpdate({
- type: 'task_updated',
- taskId: id,
- channelId: task.channel_id || '',
- task: {
- id: task.id,
- title: task.title,
- ...(task.description ? { description: task.description } : {}),
- status: task.status,
- priority: task.priority,
- assignedTo: task.assigned_to,
- ...(task.due_date ? { dueDate: task.due_date.toISOString() } : {}),
- progress: task.progress_percentage,
- tags: task.tags,
- },
- action: 'assign',
- changes: { assigned_to: user_ids },
- userId: request.user.userId,
- userName: request.user.name,
- userRole: request.user.role,
- });
- // Send notifications to newly assigned users
- for (const userId of user_ids) {
- await utils_1.WebSocketUtils.createAndSendNotification(userId, {
- title: 'Task Assigned',
- message: `You have been assigned to task: ${task.title}`,
- category: 'task',
- priority: task.priority === 'critical' || task.priority === 'urgent' ? 'high' : 'medium',
- actionUrl: `/tasks/${task.id}`,
- actionText: 'View Task',
- data: { taskId: task.id, taskTitle: task.title },
- });
- }
- }
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- taskId: id,
- assignedUsers: user_ids,
- }, 'Users assigned to task successfully');
- reply.send({
- success: true,
- message: 'Users assigned successfully',
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.userId,
- email: request.user.email ?? '',
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to assign users to task');
- if (error instanceof errors_1.ValidationError) {
- reply.code(400).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to assign users',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * DELETE /tasks/:id - Delete task
- */
- fastify.delete('/tasks/:id', {
- preHandler: [middleware_1.authenticate, (0, middleware_1.authorize)('tasks:delete')],
- schema: {
- params: typebox_1.Type.Object({
- id: validation_1.UUIDSchema,
- }),
- response: {
- 200: validation_1.SuccessResponseSchema,
- },
- },
- }, async (request, reply) => {
- try {
- const { id } = request.params;
- const success = await index_1.taskRepository.softDelete(id, request.user.userId);
- if (!success) {
- throw new errors_1.NotFoundError('Task not found');
- }
- // Clear task cache
- await CacheService_1.cacheService.tasks.delete(cache_decorators_1.CacheKeyUtils.taskKey(id));
- // Broadcast task deletion
- await utils_1.WebSocketUtils.broadcastTaskUpdate({
- type: 'task_deleted',
- taskId: id,
- task: {},
- action: 'delete',
- userId: request.user.userId,
- userName: request.user.name,
- userRole: request.user.role,
- });
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- taskId: id,
- }, 'Task deleted successfully');
- reply.send({
- success: true,
- message: 'Task deleted successfully',
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.userId,
- email: request.user.email ?? '',
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to delete task');
- if (error instanceof errors_1.NotFoundError) {
- reply.code(404).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to delete task',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * GET /tasks/stats - Get task statistics
- */
- fastify.get('/tasks/stats', {
- preHandler: [middleware_1.authenticate],
- schema: {
- querystring: typebox_1.Type.Object({
- user_id: typebox_1.Type.Optional(validation_1.UUIDSchema),
- }),
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: TaskStatsSchema,
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const { user_id } = request.query;
- // Only CEO can view stats for other users
- const targetUserId = user_id && request.user.role === 'ceo' ? user_id : request.user.userId;
- const stats = await index_1.taskRepository.getTaskStats(targetUserId);
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- targetUserId,
- stats,
- }, 'Task stats retrieved');
- reply.send({
- success: true,
- data: stats,
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.userId,
- email: request.user.email ?? '',
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to retrieve task stats');
- reply.code(500).send({
- error: {
- message: 'Failed to retrieve task stats',
- code: 'SERVER_ERROR',
- },
- });
- }
- });
- /**
- * GET /channels/:channelId/tasks - Get channel tasks
- */
- fastify.get('/channels/:channelId/tasks', {
- preHandler: [middleware_1.authenticate, middleware_1.requireChannelAccess],
- schema: {
- params: typebox_1.Type.Object({
- channelId: validation_1.UUIDSchema,
- }),
- querystring: typebox_1.Type.Intersect([
- validation_1.PaginationSchema,
- typebox_1.Type.Object({
- status: typebox_1.Type.Optional(typebox_1.Type.Array(validation_1.TaskStatusSchema)),
- priority: typebox_1.Type.Optional(typebox_1.Type.Array(validation_1.TaskPrioritySchema)),
- assigned_to: typebox_1.Type.Optional(validation_1.UUIDSchema),
- }),
- ]),
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: typebox_1.Type.Array(TaskResponseSchema),
- pagination: typebox_1.Type.Object({
- total: typebox_1.Type.Integer(),
- limit: typebox_1.Type.Integer(),
- offset: typebox_1.Type.Integer(),
- hasMore: typebox_1.Type.Boolean(),
- }),
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const { channelId } = request.params;
- const { limit = 20, offset = 0, status, priority, assigned_to } = request.query;
- // Build filters
- const filters = {
- channelId,
- status,
- priority,
- assignedTo: assigned_to ? [assigned_to] : undefined,
- };
- const tasks = await index_1.taskRepository.findWithFilters(filters, Math.min(limit, 100), offset);
- const total = tasks.length; // Simplified - in production, implement proper count query
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- channelId,
- taskCount: tasks.length,
- filters,
- }, 'Channel tasks retrieved');
- reply.send({
- success: true,
- data: tasks,
- pagination: {
- total,
- limit,
- offset,
- hasMore: offset + limit < total,
- },
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.userId,
- email: request.user.email ?? '',
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to retrieve channel tasks');
- reply.code(500).send({
- error: {
- message: 'Failed to retrieve channel tasks',
- code: 'SERVER_ERROR',
- },
- });
- }
- });
- /**
- * POST /channels/:channelId/tasks - Create task in channel
- */
- fastify.post('/channels/:channelId/tasks', {
- preHandler: [middleware_1.authenticate, middleware_1.requireChannelAccess, (0, middleware_1.authorize)('tasks:create')],
- schema: {
- params: typebox_1.Type.Object({
- channelId: validation_1.UUIDSchema,
- }),
- body: typebox_1.Type.Omit(CreateTaskSchema, ['channel_id']),
- response: {
- 201: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: TaskResponseSchema,
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const { channelId } = request.params;
- const taskData = {
- ...request.body,
- channel_id: channelId,
- created_by: request.user.userId,
- assigned_to: request.body.assigned_to || [request.user.userId],
- owned_by: request.body.owned_by || request.user.userId,
- tags: request.body.tags || [],
- labels: request.body.labels || {},
- due_date: request.body.due_date ? new Date(request.body.due_date) : undefined,
- start_date: request.body.start_date ? new Date(request.body.start_date) : undefined,
- };
- const task = await taskService.createTask(taskData);
- // Create activity for channel task creation
- try {
- await index_1.activityRepository.createActivity({
- channelId,
- taskId: task.id,
- userId: request.user.userId,
- activityType: 'task_created',
- title: `Channel Task Created: ${task.title}`,
- description: `New task "${task.title}" was created in channel${task.description ? ': ' + task.description : ''}`,
- priority: task.priority,
- category: 'task',
- metadata: {
- taskId: task.id,
- taskTitle: task.title,
- taskStatus: task.status,
- taskPriority: task.priority,
- assignedTo: task.assigned_to,
- channelId,
- createdBy: request.user.userId,
- createdByName: request.user.name,
- isChannelTask: true
- }
- });
- }
- catch (error) {
- logger_1.loggers.api.warn?.({ error, taskId: task.id, channelId }, 'Failed to create channel task creation activity');
- }
- // Broadcast task creation to channel and task management system
- await utils_1.WebSocketUtils.broadcastTaskUpdate({
- type: 'task_created',
- taskId: task.id,
- channelId,
- task: {
- id: task.id,
- title: task.title,
- ...(task.description ? { description: task.description } : {}),
- status: task.status,
- priority: task.priority,
- assignedTo: task.assigned_to,
- ...(task.due_date ? { dueDate: task.due_date.toISOString() } : {}),
- progress: task.progress_percentage,
- tags: task.tags,
- },
- action: 'create',
- userId: request.user.userId,
- userName: request.user.name,
- userRole: request.user.role,
- });
- // Send channel notification message
- if (channelId) {
- await utils_1.WebSocketUtils.broadcastChannelMessage({
- type: 'chat_message',
- channelId,
- messageId: `task_created_${task.id}`,
- message: `Task "${task.title}" was created`,
- messageType: 'system',
- userId: request.user.userId,
- userName: request.user.name,
- userRole: request.user.role,
- });
- }
- // Send notifications to assignees
- if (task.assigned_to.length > 0) {
- for (const assigneeId of task.assigned_to) {
- if (assigneeId !== request.user.userId) {
- await utils_1.WebSocketUtils.createAndSendNotification(assigneeId, {
- title: 'New Channel Task Assigned',
- message: `You have been assigned to task: ${task.title} in channel`,
- category: 'task',
- priority: task.priority === 'critical' || task.priority === 'urgent' ? 'high' : 'medium',
- actionUrl: `/channels/${channelId}?task=${task.id}`,
- actionText: 'View Task',
- data: {
- taskId: task.id,
- taskTitle: task.title,
- channelId,
- },
- });
- }
- }
- }
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- channelId,
- taskId: task.id,
- taskTitle: task.title,
- assignedTo: task.assigned_to,
- }, 'Channel task created successfully');
- reply.code(201).send({
- success: true,
- data: task,
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.userId,
- email: request.user.email ?? '',
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to create channel task');
- if (error instanceof errors_1.ValidationError) {
- reply.code(400).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to create channel task',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * PUT /tasks/:id/channel - Link task to channel
- */
- fastify.put('/tasks/:id/channel', {
- preHandler: [middleware_1.authenticate, (0, middleware_1.authorize)('tasks:update')],
- schema: {
- params: typebox_1.Type.Object({
- id: validation_1.UUIDSchema,
- }),
- body: typebox_1.Type.Object({
- channel_id: typebox_1.Type.Union([validation_1.UUIDSchema, typebox_1.Type.Null()]),
- }),
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: TaskResponseSchema,
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const { id } = request.params;
- const { channel_id } = request.body;
- // Check if user can update this task
- const existingTask = await index_1.taskRepository.findById(id);
- if (!existingTask) {
- throw new errors_1.NotFoundError('Task not found');
- }
- const canUpdate = request.user.role === 'ceo' ||
- existingTask.assigned_to.includes(request.user.userId) ||
- existingTask.created_by === request.user.userId ||
- existingTask.owned_by === request.user.userId;
- if (!canUpdate) {
- throw new errors_1.AuthorizationError('You do not have permission to update this task');
- }
- // If linking to a channel, verify user has access
- if (channel_id) {
- const hasChannelAccess = await index_1.channelRepository.canUserAccess(channel_id, request.user.userId, request.user.role);
- if (!hasChannelAccess) {
- throw new errors_1.AuthorizationError('You do not have access to this channel');
- }
- }
- const task = await taskService.updateTask(id, { channel_id });
- // Broadcast to both old and new channels
- if (existingTask.channel_id) {
- await utils_1.WebSocketUtils.broadcastChannelMessage({
- type: 'chat_message',
- channelId: existingTask.channel_id,
- messageId: `task_unlink_${task.id}`,
- message: `Task "${task.title}" was unlinked from this channel`,
- messageType: 'system',
- userId: request.user.userId,
- userName: request.user.name,
- userRole: request.user.role,
- });
- }
- if (channel_id) {
- await utils_1.WebSocketUtils.broadcastChannelMessage({
- type: 'chat_message',
- channelId: channel_id,
- messageId: `task_link_${task.id}`,
- message: `Task "${task.title}" was linked to this channel`,
- messageType: 'system',
- userId: request.user.userId,
- userName: request.user.name,
- userRole: request.user.role,
- });
- }
- // Also broadcast to task system
- await utils_1.WebSocketUtils.broadcastTaskUpdate({
- type: 'task_updated',
- taskId: id,
- channelId: channel_id || '',
- task: {
- id: task.id,
- title: task.title,
- ...(task.description ? { description: task.description } : {}),
- status: task.status,
- priority: task.priority,
- assignedTo: task.assigned_to,
- ...(task.due_date ? { dueDate: task.due_date.toISOString() } : {}),
- progress: task.progress_percentage,
- tags: task.tags,
- },
- action: 'update',
- changes: { channel_id },
- userId: request.user.userId,
- userName: request.user.name,
- userRole: request.user.role,
- });
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- taskId: id,
- oldChannelId: existingTask.channel_id,
- newChannelId: channel_id,
- }, 'Task channel link updated successfully');
- reply.send({
- success: true,
- data: task,
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.userId,
- email: request.user.email ?? '',
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to update task channel link');
- if (error instanceof errors_1.NotFoundError || error instanceof errors_1.AuthorizationError) {
- reply.code(error.statusCode).send((0, errors_1.formatErrorResponse)(error));
- }
- else if (error instanceof errors_1.ValidationError) {
- reply.code(400).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to update task channel link',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * GET /channels/:channelId/tasks/stats - Get channel task statistics
- */
- fastify.get('/channels/:channelId/tasks/stats', {
- preHandler: [middleware_1.authenticate, middleware_1.requireChannelAccess],
- schema: {
- params: typebox_1.Type.Object({
- channelId: validation_1.UUIDSchema,
- }),
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: TaskStatsSchema,
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
- }),
- },
- },
- }, async (request, reply) => {
- try {
- const { channelId } = request.params;
- // Get channel task statistics by using regular getTaskStats with channel filter
- // This is a simplified implementation - in production, implement proper channel stats
- const stats = await index_1.taskRepository.getTaskStats(request.user.userId);
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- channelId,
- stats,
- }, 'Channel task stats retrieved');
- reply.send({
- success: true,
- data: stats,
- timestamp: new Date().toISOString(),
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.userId,
- email: request.user.email ?? '',
- role: request.user.role,
- },
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to retrieve channel task stats');
- reply.code(500).send({
- error: {
- message: 'Failed to retrieve channel task stats',
- code: 'SERVER_ERROR',
- },
- });
- }
- });
-};
-exports.registerTaskRoutes = registerTaskRoutes;
-//# sourceMappingURL=TaskRoutes.js.map
\ No newline at end of file
diff --git a/backend/dist/api/routes/TaskRoutes.js.map b/backend/dist/api/routes/TaskRoutes.js.map
deleted file mode 100644
index 1f1431d..0000000
--- a/backend/dist/api/routes/TaskRoutes.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"TaskRoutes.js","sourceRoot":"","sources":["../../../src/api/routes/TaskRoutes.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/api/routes/UserRoutes.d.ts b/backend/dist/api/routes/UserRoutes.d.ts
deleted file mode 100644
index 5704dcc..0000000
--- a/backend/dist/api/routes/UserRoutes.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { FastifyInstance } from 'fastify';
-/**
- * Register user routes
- */
-export declare const registerUserRoutes: (fastify: FastifyInstance) => Promise;
-//# sourceMappingURL=UserRoutes.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/api/routes/UserRoutes.d.ts.map b/backend/dist/api/routes/UserRoutes.d.ts.map
deleted file mode 100644
index 7877aa9..0000000
--- a/backend/dist/api/routes/UserRoutes.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"UserRoutes.d.ts","sourceRoot":"","sources":["../../../src/api/routes/UserRoutes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AA+HxE;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAU,SAAS,eAAe,kBAynBhE,CAAC"}
\ No newline at end of file
diff --git a/backend/dist/api/routes/UserRoutes.js b/backend/dist/api/routes/UserRoutes.js
deleted file mode 100644
index 169fea0..0000000
--- a/backend/dist/api/routes/UserRoutes.js
+++ /dev/null
@@ -1,704 +0,0 @@
-"use strict";
-var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
- var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
- if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
- else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
- return c > 3 && r && Object.defineProperty(target, key, r), r;
-};
-var __metadata = (this && this.__metadata) || function (k, v) {
- if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.registerUserRoutes = void 0;
-const typebox_1 = require("@sinclair/typebox");
-const index_1 = require("@db/index");
-const logger_1 = require("@utils/logger");
-const errors_1 = require("@utils/errors");
-const middleware_1 = require("@auth/middleware");
-const CacheService_1 = require("../../services/CacheService");
-const cache_decorators_1 = require("@utils/cache-decorators");
-const validation_1 = require("@utils/validation");
-/**
- * User Management API Routes
- * Enterprise-grade user CRUD operations with caching and security
- */
-// Request/Response Schemas
-const CreateUserSchema = typebox_1.Type.Object({
- email: validation_1.EmailSchema,
- password: typebox_1.Type.String({ minLength: 8, maxLength: 128 }),
- name: typebox_1.Type.String({ minLength: 1, maxLength: 255 }),
- role: validation_1.UserRoleSchema,
- department: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 100 })),
- job_title: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 100 })),
- phone: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 20 })),
- avatar_url: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'uri' })),
- timezone: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 50 })),
- language_preference: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 10 })),
-});
-const UpdateUserSchema = typebox_1.Type.Object({
- name: typebox_1.Type.Optional(typebox_1.Type.String({ minLength: 1, maxLength: 255 })),
- department: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 100 })),
- job_title: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 100 })),
- phone: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 20 })),
- avatar_url: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'uri' })),
- timezone: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 50 })),
- language_preference: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 10 })),
- notification_settings: typebox_1.Type.Optional(typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.Any())),
- voice_settings: typebox_1.Type.Optional(typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.Any())),
-});
-const ChangePasswordSchema = typebox_1.Type.Object({
- currentPassword: typebox_1.Type.String(),
- newPassword: typebox_1.Type.String({ minLength: 8, maxLength: 128 }),
-});
-const UserResponseSchema = typebox_1.Type.Object({
- id: validation_1.UUIDSchema,
- email: validation_1.EmailSchema,
- name: typebox_1.Type.String(),
- role: validation_1.UserRoleSchema,
- department: typebox_1.Type.Optional(typebox_1.Type.String()),
- job_title: typebox_1.Type.Optional(typebox_1.Type.String()),
- phone: typebox_1.Type.Optional(typebox_1.Type.String()),
- avatar_url: typebox_1.Type.Optional(typebox_1.Type.String()),
- timezone: typebox_1.Type.Optional(typebox_1.Type.String()),
- language_preference: typebox_1.Type.Optional(typebox_1.Type.String()),
- notification_settings: typebox_1.Type.Optional(typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.Any())),
- voice_settings: typebox_1.Type.Optional(typebox_1.Type.Record(typebox_1.Type.String(), typebox_1.Type.Any())),
- email_verified: typebox_1.Type.Boolean(),
- last_active: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'date-time' })),
- created_at: typebox_1.Type.String({ format: 'date-time' }),
- updated_at: typebox_1.Type.String({ format: 'date-time' }),
-});
-const UserListResponseSchema = typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: typebox_1.Type.Array(UserResponseSchema),
- pagination: typebox_1.Type.Object({
- total: typebox_1.Type.Integer(),
- limit: typebox_1.Type.Integer(),
- offset: typebox_1.Type.Integer(),
- hasMore: typebox_1.Type.Boolean(),
- }),
- timestamp: typebox_1.Type.String({ format: 'date-time' }),
-});
-/**
- * User service class with caching decorators
- */
-class UserService {
- async getUserById(userId) {
- return await index_1.userRepository.findById(userId);
- }
- async updateUser(userId, updateData) {
- return await index_1.userRepository.update(userId, updateData);
- }
- async createUser(userData) {
- return await index_1.userRepository.createUser(userData);
- }
-}
-__decorate([
- (0, cache_decorators_1.Cacheable)({
- ttl: 3600,
- namespace: 'users',
- keyGenerator: (userId) => cache_decorators_1.CacheKeyUtils.userKey(userId)
- }),
- __metadata("design:type", Function),
- __metadata("design:paramtypes", [String]),
- __metadata("design:returntype", Promise)
-], UserService.prototype, "getUserById", null);
-__decorate([
- (0, cache_decorators_1.CacheEvict)({
- keys: (userId) => [cache_decorators_1.CacheKeyUtils.userKey(userId), `${cache_decorators_1.CacheKeyUtils.userKey(userId)}:profile`],
- namespace: 'users'
- }),
- __metadata("design:type", Function),
- __metadata("design:paramtypes", [String, Object]),
- __metadata("design:returntype", Promise)
-], UserService.prototype, "updateUser", null);
-__decorate([
- (0, cache_decorators_1.CacheEvict)({
- allEntries: true,
- namespace: 'users'
- }),
- __metadata("design:type", Function),
- __metadata("design:paramtypes", [Object]),
- __metadata("design:returntype", Promise)
-], UserService.prototype, "createUser", null);
-const userService = new UserService();
-/**
- * Register user routes
- */
-const registerUserRoutes = async (fastify) => {
- /**
- * GET /users - List all users (Admin/Manager only)
- */
- fastify.get('/users', {
- preHandler: [middleware_1.authenticate, (0, middleware_1.authorizeRoles)('ceo', 'manager'), middleware_1.apiRateLimit],
- schema: {
- querystring: typebox_1.Type.Intersect([
- validation_1.PaginationSchema,
- typebox_1.Type.Object({
- search: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 100 })),
- role: typebox_1.Type.Optional(validation_1.UserRoleSchema),
- department: typebox_1.Type.Optional(typebox_1.Type.String({ maxLength: 100 })),
- status: typebox_1.Type.Optional(typebox_1.Type.Union([
- typebox_1.Type.Literal('active'),
- typebox_1.Type.Literal('inactive'),
- typebox_1.Type.Literal('suspended')
- ])),
- })
- ]),
- response: {
- 200: UserListResponseSchema,
- 401: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String()
- })
- }),
- 403: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String()
- })
- })
- }
- }
- }, async (request, reply) => {
- try {
- const { limit = 20, offset = 0, search, role, department, status } = request.query;
- // Build filters
- const filters = {};
- if (search) {
- filters.search = search;
- }
- if (role) {
- filters.role = role;
- }
- if (department) {
- filters.department = department;
- }
- if (status) {
- filters.status = status;
- }
- // Get users with pagination
- const result = await index_1.userRepository.findMany({
- filters,
- limit: Math.min(limit, 100), // Cap at 100
- offset,
- orderBy: 'created_at',
- orderDirection: 'DESC'
- });
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- filters,
- resultCount: result.data.length,
- total: result.total
- }, 'Users list retrieved');
- reply.send({
- success: true,
- data: result.data.map(user => ({
- ...user,
- // Remove sensitive fields
- password_hash: undefined,
- reset_token: undefined,
- verification_token: undefined,
- })),
- pagination: {
- total: result.total,
- limit,
- offset,
- hasMore: offset + limit < result.total
- },
- timestamp: new Date().toISOString()
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role
- }
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to retrieve users list');
- reply.code(500).send({
- error: {
- message: 'Failed to retrieve users',
- code: 'SERVER_ERROR'
- }
- });
- }
- });
- /**
- * GET /users/:id - Get user by ID
- */
- fastify.get('/users/:id', {
- preHandler: [middleware_1.authenticate, (0, middleware_1.requireResourceOwnership)('id')],
- schema: {
- params: typebox_1.Type.Object({
- id: validation_1.UUIDSchema
- }),
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: UserResponseSchema,
- timestamp: typebox_1.Type.String({ format: 'date-time' })
- }),
- 404: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String()
- })
- })
- }
- }
- }, async (request, reply) => {
- try {
- const { id } = request.params;
- // Use cached service method
- const user = await userService.getUserById(id);
- if (!user) {
- throw new errors_1.NotFoundError('User not found');
- }
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- requestedUserId: id
- }, 'User profile retrieved');
- reply.send({
- success: true,
- data: {
- ...user,
- // Remove sensitive fields
- password_hash: undefined,
- reset_token: undefined,
- verification_token: undefined,
- },
- timestamp: new Date().toISOString()
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role
- }
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to retrieve user');
- if (error instanceof errors_1.NotFoundError) {
- reply.code(404).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to retrieve user',
- code: 'SERVER_ERROR'
- }
- });
- }
- }
- });
- /**
- * POST /users - Create new user (Admin only)
- */
- fastify.post('/users', {
- preHandler: [middleware_1.authenticate, (0, middleware_1.authorizeRoles)('ceo'), middleware_1.apiRateLimit],
- schema: {
- body: CreateUserSchema,
- response: {
- 201: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: UserResponseSchema,
- timestamp: typebox_1.Type.String({ format: 'date-time' })
- }),
- 400: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String(),
- details: typebox_1.Type.Optional(typebox_1.Type.Array(typebox_1.Type.Object({
- field: typebox_1.Type.String(),
- message: typebox_1.Type.String(),
- value: typebox_1.Type.Optional(typebox_1.Type.Any())
- })))
- })
- })
- }
- }
- }, async (request, reply) => {
- try {
- const userData = {
- ...request.body,
- created_by: request.user?.userId,
- };
- // Create user using cached service
- const user = await userService.createUser(userData);
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- createdUserId: user.id,
- userEmail: user.email,
- userRole: user.role
- }, 'User created successfully');
- reply.code(201).send({
- success: true,
- data: {
- ...user,
- password_hash: undefined,
- reset_token: undefined,
- verification_token: undefined,
- },
- timestamp: new Date().toISOString()
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role
- }
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to create user');
- if (error instanceof errors_1.ValidationError) {
- reply.code(400).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to create user',
- code: 'SERVER_ERROR'
- }
- });
- }
- }
- });
- /**
- * PUT /users/:id - Update user
- */
- fastify.put('/users/:id', {
- preHandler: [middleware_1.authenticate, (0, middleware_1.requireResourceOwnership)('id')],
- schema: {
- params: typebox_1.Type.Object({
- id: validation_1.UUIDSchema
- }),
- body: UpdateUserSchema,
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: UserResponseSchema,
- timestamp: typebox_1.Type.String({ format: 'date-time' })
- })
- }
- }
- }, async (request, reply) => {
- try {
- const { id } = request.params;
- const updateData = request.body;
- // Update user using cached service (will evict cache)
- const user = await userService.updateUser(id, updateData);
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- updatedUserId: id,
- updatedFields: Object.keys(updateData)
- }, 'User updated successfully');
- reply.send({
- success: true,
- data: {
- ...user,
- password_hash: undefined,
- reset_token: undefined,
- verification_token: undefined,
- },
- timestamp: new Date().toISOString()
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role
- }
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to update user');
- if (error instanceof errors_1.NotFoundError) {
- reply.code(404).send((0, errors_1.formatErrorResponse)(error));
- }
- else if (error instanceof errors_1.ValidationError) {
- reply.code(400).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to update user',
- code: 'SERVER_ERROR'
- }
- });
- }
- }
- });
- /**
- * POST /users/:id/change-password - Change user password
- */
- fastify.post('/users/:id/change-password', {
- preHandler: [middleware_1.authenticate, (0, middleware_1.requireResourceOwnership)('id')],
- schema: {
- params: typebox_1.Type.Object({
- id: validation_1.UUIDSchema
- }),
- body: ChangePasswordSchema,
- response: {
- 200: validation_1.SuccessResponseSchema
- }
- }
- }, async (request, reply) => {
- try {
- const { id } = request.params;
- const { currentPassword, newPassword } = request.body;
- // Verify current password
- const user = await index_1.userRepository.findById(id);
- if (!user) {
- throw new errors_1.NotFoundError('User not found');
- }
- const isCurrentPasswordValid = await index_1.userRepository.verifyPassword(user.email, currentPassword);
- if (!isCurrentPasswordValid) {
- throw new errors_1.ValidationError('Current password is incorrect', [
- { field: 'currentPassword', message: 'Invalid password' }
- ]);
- }
- // Update password
- const success = await index_1.userRepository.updatePassword(id, newPassword);
- if (!success) {
- throw new Error('Failed to update password');
- }
- // Clear user cache
- await CacheService_1.cacheService.users.delete(cache_decorators_1.CacheKeyUtils.userKey(id));
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- targetUserId: id
- }, 'Password changed successfully');
- reply.send({
- success: true,
- message: 'Password changed successfully',
- timestamp: new Date().toISOString()
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role
- }
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to change password');
- if (error instanceof errors_1.NotFoundError || error instanceof errors_1.ValidationError) {
- reply.code(400).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to change password',
- code: 'SERVER_ERROR'
- }
- });
- }
- }
- });
- /**
- * DELETE /users/:id - Soft delete user (Admin only)
- */
- fastify.delete('/users/:id', {
- preHandler: [middleware_1.authenticate, (0, middleware_1.authorizeRoles)('ceo')],
- schema: {
- params: typebox_1.Type.Object({
- id: validation_1.UUIDSchema
- }),
- response: {
- 200: validation_1.SuccessResponseSchema
- }
- }
- }, async (request, reply) => {
- try {
- const { id } = request.params;
- // Prevent self-deletion
- if (id === request.user?.userId) {
- throw new errors_1.ValidationError('Cannot delete your own account', []);
- }
- const success = await index_1.userRepository.softDelete(id, request.user.userId);
- if (!success) {
- throw new errors_1.NotFoundError('User not found');
- }
- // Clear user cache
- await CacheService_1.cacheService.users.delete(cache_decorators_1.CacheKeyUtils.userKey(id));
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- deletedUserId: id
- }, 'User deleted successfully');
- reply.send({
- success: true,
- message: 'User deleted successfully',
- timestamp: new Date().toISOString()
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role
- }
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to delete user');
- if (error instanceof errors_1.NotFoundError || error instanceof errors_1.ValidationError) {
- reply.code(400).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to delete user',
- code: 'SERVER_ERROR'
- }
- });
- }
- }
- });
- /**
- * GET /users/:id/stats - Get user statistics (Admin/Manager only)
- */
- fastify.get('/users/:id/stats', {
- preHandler: [middleware_1.authenticate, (0, middleware_1.authorizeRoles)('ceo', 'manager')],
- schema: {
- params: typebox_1.Type.Object({
- id: validation_1.UUIDSchema
- }),
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: typebox_1.Type.Object({
- userId: validation_1.UUIDSchema,
- taskStats: typebox_1.Type.Object({
- total: typebox_1.Type.Integer(),
- completed: typebox_1.Type.Integer(),
- inProgress: typebox_1.Type.Integer(),
- overdue: typebox_1.Type.Integer(),
- }),
- channelStats: typebox_1.Type.Object({
- memberships: typebox_1.Type.Integer(),
- messagesCount: typebox_1.Type.Integer(),
- }),
- activityStats: typebox_1.Type.Object({
- lastActive: typebox_1.Type.Optional(typebox_1.Type.String({ format: 'date-time' })),
- totalSessions: typebox_1.Type.Integer(),
- avgSessionDuration: typebox_1.Type.Number(),
- }),
- }),
- timestamp: typebox_1.Type.String({ format: 'date-time' })
- })
- }
- }
- }, async (request, reply) => {
- try {
- const { id } = request.params;
- // Get user stats from repositories
- const [user, taskStats] = await Promise.all([
- index_1.userRepository.findById(id),
- // taskRepository.getTaskStats(id), // TODO: Implement
- Promise.resolve({
- total: 0,
- completed: 0,
- inProgress: 0,
- overdue: 0,
- })
- ]);
- if (!user) {
- throw new errors_1.NotFoundError('User not found');
- }
- // TODO: Get channel stats, activity stats from respective repositories
- const stats = {
- userId: id,
- taskStats,
- channelStats: {
- memberships: 0,
- messagesCount: 0,
- },
- activityStats: {
- lastActive: user.last_active?.toISOString(),
- totalSessions: 0,
- avgSessionDuration: 0,
- },
- };
- logger_1.loggers.api.info({
- userId: request.user?.userId,
- requestedUserId: id
- }, 'User stats retrieved');
- reply.send({
- success: true,
- data: stats,
- timestamp: new Date().toISOString()
- });
- }
- catch (error) {
- const context = (0, errors_1.createErrorContext)({
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role
- }
- }),
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers
- });
- logger_1.loggers.api.error({ error, context }, 'Failed to get user stats');
- if (error instanceof errors_1.NotFoundError) {
- reply.code(404).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to get user stats',
- code: 'SERVER_ERROR'
- }
- });
- }
- }
- });
-};
-exports.registerUserRoutes = registerUserRoutes;
-//# sourceMappingURL=UserRoutes.js.map
\ No newline at end of file
diff --git a/backend/dist/api/routes/UserRoutes.js.map b/backend/dist/api/routes/UserRoutes.js.map
deleted file mode 100644
index ea523a7..0000000
--- a/backend/dist/api/routes/UserRoutes.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"UserRoutes.js","sourceRoot":"","sources":["../../../src/api/routes/UserRoutes.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/auth/jwt.d.ts b/backend/dist/auth/jwt.d.ts
deleted file mode 100644
index 134ad55..0000000
--- a/backend/dist/auth/jwt.d.ts
+++ /dev/null
@@ -1,135 +0,0 @@
-/**
- * JWT Authentication system with refresh token support
- * Enterprise-grade security with proper token management
- */
-export interface TokenPayload {
- userId: string;
- email: string;
- role: 'ceo' | 'manager' | 'staff';
- name: string;
- permissions: string[];
- sessionId: string;
- type: 'access' | 'refresh';
- iat: number;
- exp: number;
-}
-export interface TokenPair {
- accessToken: string;
- refreshToken: string;
- expiresIn: number;
- refreshExpiresIn: number;
-}
-export interface AccessTokenData {
- token: string;
- payload: TokenPayload;
- expiresAt: Date;
-}
-/**
- * Role-based permissions mapping
- */
-declare const ROLE_PERMISSIONS: Record;
-/**
- * JWT service class
- */
-declare class JWTService {
- private readonly accessTokenSecret;
- private readonly refreshTokenSecret;
- private readonly accessTokenExpiry;
- private readonly refreshTokenExpiry;
- constructor();
- /**
- * Generate access and refresh token pair
- */
- generateTokens(user: {
- id: string;
- email: string;
- role: 'ceo' | 'manager' | 'staff';
- name: string;
- }): Promise;
- /**
- * Verify and decode access token
- */
- verifyAccessToken(token: string): Promise;
- /**
- * Verify and decode refresh token
- */
- verifyRefreshToken(token: string): Promise;
- /**
- * Refresh access token using refresh token
- */
- refreshTokens(refreshToken: string): Promise;
- /**
- * Decode token without verification (for debugging)
- */
- decodeToken(token: string): TokenPayload | null;
- /**
- * Extract token from Authorization header
- */
- extractTokenFromHeader(authHeader: string | undefined): string | null;
- /**
- * Check if user has required permission
- */
- hasPermission(payload: TokenPayload, requiredPermission: string): boolean;
- /**
- * Check if user has any of the required permissions
- */
- hasAnyPermission(payload: TokenPayload, requiredPermissions: string[]): boolean;
- /**
- * Check if user has all required permissions
- */
- hasAllPermissions(payload: TokenPayload, requiredPermissions: string[]): boolean;
- /**
- * Get token expiration date
- */
- getTokenExpiration(token: string): Date | null;
- /**
- * Check if token is expired
- */
- isTokenExpired(token: string): boolean;
- /**
- * Generate password reset token (separate from auth tokens)
- */
- generatePasswordResetToken(userId: string): string;
- /**
- * Verify password reset token
- */
- verifyPasswordResetToken(token: string, userId: string): boolean;
- /**
- * Generate email verification token
- */
- generateEmailVerificationToken(userId: string, email: string): string;
- /**
- * Verify email verification token
- */
- verifyEmailVerificationToken(token: string, email: string): {
- userId: string;
- } | null;
-}
-export declare const jwtService: JWTService;
-export default jwtService;
-export declare const PERMISSIONS: {
- readonly CHANNELS_CREATE: "channels:create";
- readonly CHANNELS_READ: "channels:read";
- readonly CHANNELS_UPDATE: "channels:update";
- readonly CHANNELS_DELETE: "channels:delete";
- readonly CHANNELS_MANAGE_MEMBERS: "channels:manage_members";
- readonly CHANNELS_ARCHIVE: "channels:archive";
- readonly TASKS_CREATE: "tasks:create";
- readonly TASKS_READ: "tasks:read";
- readonly TASKS_UPDATE: "tasks:update";
- readonly TASKS_DELETE: "tasks:delete";
- readonly TASKS_ASSIGN: "tasks:assign";
- readonly TASKS_MANAGE_DEPENDENCIES: "tasks:manage_dependencies";
- readonly USERS_CREATE: "users:create";
- readonly USERS_READ: "users:read";
- readonly USERS_UPDATE: "users:update";
- readonly USERS_DELETE: "users:delete";
- readonly USERS_MANAGE_ROLES: "users:manage_roles";
- readonly VOICE_COMMANDS: "voice:commands";
- readonly VOICE_TRANSCRIBE: "voice:transcribe";
- readonly VOICE_PROCESS: "voice:process";
- readonly SYSTEM_ADMIN: "system:admin";
- readonly ANALYTICS_READ: "analytics:read";
-};
-export { ROLE_PERMISSIONS };
-//# sourceMappingURL=jwt.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/auth/jwt.d.ts.map b/backend/dist/auth/jwt.d.ts.map
deleted file mode 100644
index 8a07b2c..0000000
--- a/backend/dist/auth/jwt.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"jwt.d.ts","sourceRoot":"","sources":["../../src/auth/jwt.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/auth/jwt.js b/backend/dist/auth/jwt.js
deleted file mode 100644
index f1a1414..0000000
--- a/backend/dist/auth/jwt.js
+++ /dev/null
@@ -1,356 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.ROLE_PERMISSIONS = exports.PERMISSIONS = exports.jwtService = void 0;
-const jsonwebtoken_1 = __importDefault(require("jsonwebtoken"));
-const index_1 = require("@config/index");
-const logger_1 = require("@utils/logger");
-const errors_1 = require("@utils/errors");
-const crypto_1 = __importDefault(require("crypto"));
-/**
- * Role-based permissions mapping
- */
-const ROLE_PERMISSIONS = {
- ceo: [
- // Wildcard permission - CEO has access to everything
- '*'
- ],
- manager: [
- // Channel management within scope
- 'channels:create', 'channels:read', 'channels:update',
- 'channels:manage_members',
- // Task management
- 'tasks:create', 'tasks:read', 'tasks:update',
- 'tasks:assign', 'tasks:manage_dependencies',
- // Limited user management
- 'users:read', 'users:update_profile',
- // Voice features (limited)
- 'voice:commands',
- // Analytics (read-only)
- 'analytics:read'
- ],
- staff: [
- // Basic channel access
- 'channels:read', 'channels:participate',
- // Task participation
- 'tasks:read', 'tasks:update_own', 'tasks:comment',
- // Profile management
- 'users:read_own', 'users:update_own_profile',
- // No voice commands (CEO-only feature)
- ]
-};
-exports.ROLE_PERMISSIONS = ROLE_PERMISSIONS;
-/**
- * Generate cryptographically secure session ID
- */
-const generateSessionId = () => {
- return crypto_1.default.randomBytes(32).toString('hex');
-};
-/**
- * Convert time string to seconds
- */
-const parseTimeToSeconds = (timeStr) => {
- const unit = timeStr.slice(-1);
- const value = parseInt(timeStr.slice(0, -1));
- switch (unit) {
- case 's': return value;
- case 'm': return value * 60;
- case 'h': return value * 3600;
- case 'd': return value * 86400;
- default: return value;
- }
-};
-/**
- * JWT service class
- */
-class JWTService {
- accessTokenSecret;
- refreshTokenSecret;
- accessTokenExpiry;
- refreshTokenExpiry;
- constructor() {
- this.accessTokenSecret = index_1.config.jwt.secret;
- this.refreshTokenSecret = index_1.config.jwt.refreshSecret;
- this.accessTokenExpiry = index_1.config.jwt.expiresIn;
- this.refreshTokenExpiry = index_1.config.jwt.refreshExpiresIn;
- }
- /**
- * Generate access and refresh token pair
- */
- async generateTokens(user) {
- const sessionId = generateSessionId();
- const permissions = ROLE_PERMISSIONS[user.role] || [];
- const basePayload = {
- userId: user.id,
- email: user.email,
- role: user.role,
- name: user.name,
- permissions,
- sessionId
- };
- // Generate access token
- const accessToken = jsonwebtoken_1.default.sign({ ...basePayload, type: 'access' }, this.accessTokenSecret, {
- expiresIn: this.accessTokenExpiry,
- issuer: 'ceo-platform',
- audience: 'ceo-platform-api',
- subject: user.id
- });
- // Generate refresh token
- const refreshToken = jsonwebtoken_1.default.sign({ ...basePayload, type: 'refresh' }, this.refreshTokenSecret, {
- expiresIn: this.refreshTokenExpiry,
- issuer: 'ceo-platform',
- audience: 'ceo-platform-api',
- subject: user.id
- });
- const expiresIn = parseTimeToSeconds(this.accessTokenExpiry);
- const refreshExpiresIn = parseTimeToSeconds(this.refreshTokenExpiry);
- logger_1.securityLogger.logAuthEvent('token_generated', {
- userId: user.id,
- email: user.email,
- role: user.role,
- sessionId,
- expiresIn,
- refreshExpiresIn
- });
- return {
- accessToken,
- refreshToken,
- expiresIn,
- refreshExpiresIn
- };
- }
- /**
- * Verify and decode access token
- */
- async verifyAccessToken(token) {
- try {
- const payload = jsonwebtoken_1.default.verify(token, this.accessTokenSecret, {
- issuer: 'ceo-platform',
- audience: 'ceo-platform-api'
- });
- if (payload.type !== 'access') {
- throw new errors_1.InvalidTokenError('Token type mismatch - expected access token');
- }
- return payload;
- }
- catch (error) {
- if (error instanceof jsonwebtoken_1.default.TokenExpiredError) {
- throw new errors_1.TokenExpiredError('Access token has expired');
- }
- else if (error instanceof jsonwebtoken_1.default.JsonWebTokenError) {
- throw new errors_1.InvalidTokenError(`Invalid access token: ${error.message}`);
- }
- else {
- logger_1.logger.error({ error }, 'Unexpected error verifying access token');
- throw new errors_1.AuthenticationError('Token verification failed');
- }
- }
- }
- /**
- * Verify and decode refresh token
- */
- async verifyRefreshToken(token) {
- try {
- const payload = jsonwebtoken_1.default.verify(token, this.refreshTokenSecret, {
- issuer: 'ceo-platform',
- audience: 'ceo-platform-api'
- });
- if (payload.type !== 'refresh') {
- throw new errors_1.InvalidTokenError('Token type mismatch - expected refresh token');
- }
- return payload;
- }
- catch (error) {
- if (error instanceof jsonwebtoken_1.default.TokenExpiredError) {
- logger_1.securityLogger.logAuthEvent('refresh_token_expired', {
- error: error.message
- });
- throw new errors_1.TokenExpiredError('Refresh token has expired');
- }
- else if (error instanceof jsonwebtoken_1.default.JsonWebTokenError) {
- logger_1.securityLogger.logSecurityViolation('invalid_refresh_token', {
- error: error.message,
- token: token.substring(0, 20) + '...'
- });
- throw new errors_1.InvalidTokenError(`Invalid refresh token: ${error.message}`);
- }
- else {
- logger_1.logger.error({ error }, 'Unexpected error verifying refresh token');
- throw new errors_1.AuthenticationError('Refresh token verification failed');
- }
- }
- }
- /**
- * Refresh access token using refresh token
- */
- async refreshTokens(refreshToken) {
- const payload = await this.verifyRefreshToken(refreshToken);
- // Generate new token pair with same user data
- const user = {
- id: payload.userId,
- email: payload.email,
- role: payload.role,
- name: payload.name
- };
- const newTokens = await this.generateTokens(user);
- logger_1.securityLogger.logAuthEvent('token_refreshed', {
- userId: payload.userId,
- email: payload.email,
- oldSessionId: payload.sessionId,
- newSessionId: 'generated' // New session ID is in the new tokens
- });
- return newTokens;
- }
- /**
- * Decode token without verification (for debugging)
- */
- decodeToken(token) {
- try {
- const payload = jsonwebtoken_1.default.decode(token);
- return payload;
- }
- catch (error) {
- logger_1.logger.warn({ error }, 'Failed to decode token');
- return null;
- }
- }
- /**
- * Extract token from Authorization header
- */
- extractTokenFromHeader(authHeader) {
- if (!authHeader || typeof authHeader !== 'string') {
- return null;
- }
- const parts = authHeader.split(' ');
- if (parts.length !== 2 || parts[0] !== 'Bearer') {
- return null;
- }
- return parts[1] || null;
- }
- /**
- * Check if user has required permission
- */
- hasPermission(payload, requiredPermission) {
- // Check for wildcard permission first (CEO has all permissions)
- if (payload.permissions.includes('*')) {
- return true;
- }
- return payload.permissions.includes(requiredPermission);
- }
- /**
- * Check if user has any of the required permissions
- */
- hasAnyPermission(payload, requiredPermissions) {
- // Check for wildcard permission first (CEO has all permissions)
- if (payload.permissions.includes('*')) {
- return true;
- }
- return requiredPermissions.some(permission => payload.permissions.includes(permission));
- }
- /**
- * Check if user has all required permissions
- */
- hasAllPermissions(payload, requiredPermissions) {
- // Check for wildcard permission first (CEO has all permissions)
- if (payload.permissions.includes('*')) {
- return true;
- }
- return requiredPermissions.every(permission => payload.permissions.includes(permission));
- }
- /**
- * Get token expiration date
- */
- getTokenExpiration(token) {
- const payload = this.decodeToken(token);
- if (!payload || !payload.exp) {
- return null;
- }
- return new Date(payload.exp * 1000);
- }
- /**
- * Check if token is expired
- */
- isTokenExpired(token) {
- const expiration = this.getTokenExpiration(token);
- if (!expiration) {
- return true;
- }
- return expiration.getTime() < Date.now();
- }
- /**
- * Generate password reset token (separate from auth tokens)
- */
- generatePasswordResetToken(userId) {
- return jsonwebtoken_1.default.sign({ userId, type: 'password_reset' }, this.accessTokenSecret + userId, // Include user ID in secret for security
- { expiresIn: '1h' });
- }
- /**
- * Verify password reset token
- */
- verifyPasswordResetToken(token, userId) {
- try {
- const payload = jsonwebtoken_1.default.verify(token, this.accessTokenSecret + userId);
- return payload.userId === userId && payload.type === 'password_reset';
- }
- catch (error) {
- return false;
- }
- }
- /**
- * Generate email verification token
- */
- generateEmailVerificationToken(userId, email) {
- return jsonwebtoken_1.default.sign({ userId, email, type: 'email_verification' }, this.accessTokenSecret + email, { expiresIn: '24h' });
- }
- /**
- * Verify email verification token
- */
- verifyEmailVerificationToken(token, email) {
- try {
- const payload = jsonwebtoken_1.default.verify(token, this.accessTokenSecret + email);
- if (payload.email === email && payload.type === 'email_verification') {
- return { userId: payload.userId };
- }
- return null;
- }
- catch (error) {
- return null;
- }
- }
-}
-// Export singleton instance
-exports.jwtService = new JWTService();
-exports.default = exports.jwtService;
-// Export permission constants
-exports.PERMISSIONS = {
- // Channel permissions
- CHANNELS_CREATE: 'channels:create',
- CHANNELS_READ: 'channels:read',
- CHANNELS_UPDATE: 'channels:update',
- CHANNELS_DELETE: 'channels:delete',
- CHANNELS_MANAGE_MEMBERS: 'channels:manage_members',
- CHANNELS_ARCHIVE: 'channels:archive',
- // Task permissions
- TASKS_CREATE: 'tasks:create',
- TASKS_READ: 'tasks:read',
- TASKS_UPDATE: 'tasks:update',
- TASKS_DELETE: 'tasks:delete',
- TASKS_ASSIGN: 'tasks:assign',
- TASKS_MANAGE_DEPENDENCIES: 'tasks:manage_dependencies',
- // User permissions
- USERS_CREATE: 'users:create',
- USERS_READ: 'users:read',
- USERS_UPDATE: 'users:update',
- USERS_DELETE: 'users:delete',
- USERS_MANAGE_ROLES: 'users:manage_roles',
- // Voice permissions
- VOICE_COMMANDS: 'voice:commands',
- VOICE_TRANSCRIBE: 'voice:transcribe',
- VOICE_PROCESS: 'voice:process',
- // System permissions
- SYSTEM_ADMIN: 'system:admin',
- ANALYTICS_READ: 'analytics:read',
-};
-//# sourceMappingURL=jwt.js.map
\ No newline at end of file
diff --git a/backend/dist/auth/jwt.js.map b/backend/dist/auth/jwt.js.map
deleted file mode 100644
index 072c6b7..0000000
--- a/backend/dist/auth/jwt.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"jwt.js","sourceRoot":"","sources":["../../src/auth/jwt.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/auth/middleware.d.ts b/backend/dist/auth/middleware.d.ts
deleted file mode 100644
index 6493bb5..0000000
--- a/backend/dist/auth/middleware.d.ts
+++ /dev/null
@@ -1,77 +0,0 @@
-import { FastifyRequest, FastifyReply } from 'fastify';
-import { TokenPayload } from './jwt';
-/**
- * Authentication and Authorization middleware for Fastify
- * Enterprise-grade security with rate limiting and audit logging
- */
-declare module 'fastify' {
- interface FastifyRequest {
- user?: (TokenPayload & {
- isAuthenticated: boolean;
- id: string;
- }) | undefined;
- }
-}
-/**
- * Authentication middleware - validates JWT tokens
- */
-export declare const authenticate: (request: FastifyRequest, reply: FastifyReply) => Promise;
-/**
- * Optional authentication middleware - doesn't throw if no token
- */
-export declare const optionalAuthenticate: (request: FastifyRequest, reply: FastifyReply) => Promise;
-/**
- * Authorization middleware factory - checks permissions
- */
-export declare const authorize: (...requiredPermissions: string[]) => (request: FastifyRequest, reply: FastifyReply) => Promise;
-/**
- * Role-based authorization middleware
- */
-export declare const authorizeRoles: (...allowedRoles: Array<"ceo" | "manager" | "staff">) => (request: FastifyRequest, reply: FastifyReply) => Promise;
-/**
- * CEO-only middleware
- */
-export declare const requireCEO: (request: FastifyRequest, reply: FastifyReply) => Promise;
-/**
- * Manager or CEO middleware
- */
-export declare const requireManagerOrCEO: (request: FastifyRequest, reply: FastifyReply) => Promise;
-/**
- * Voice commands authorization (CEO only feature)
- */
-export declare const authorizeVoiceCommands: (request: FastifyRequest, reply: FastifyReply) => Promise;
-/**
- * Rate limiting middleware
- */
-export declare const rateLimit: (options: {
- maxRequests: number;
- windowMs: number;
- keyGenerator?: (request: FastifyRequest) => string;
- skipSuccessful?: boolean;
- skipFailedRequests?: boolean;
-}) => (request: FastifyRequest, reply: FastifyReply) => Promise;
-/**
- * Strict rate limiting for authentication endpoints
- */
-export declare const authRateLimit: (request: FastifyRequest, reply: FastifyReply) => Promise;
-/**
- * Voice processing rate limiting
- */
-export declare const voiceRateLimit: (request: FastifyRequest, reply: FastifyReply) => Promise;
-/**
- * API rate limiting for general endpoints
- */
-export declare const apiRateLimit: (request: FastifyRequest, reply: FastifyReply) => Promise;
-/**
- * Resource ownership middleware - ensures user can only access their own resources
- */
-export declare const requireResourceOwnership: (userIdParam?: string) => (request: FastifyRequest, reply: FastifyReply) => Promise;
-/**
- * Channel membership middleware - ensures user has access to channel
- */
-export declare const requireChannelAccess: (request: FastifyRequest, reply: FastifyReply) => Promise;
-/**
- * Audit logging middleware - logs all requests for security audit
- */
-export declare const auditLog: (request: FastifyRequest, reply: FastifyReply) => Promise;
-//# sourceMappingURL=middleware.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/auth/middleware.d.ts.map b/backend/dist/auth/middleware.d.ts.map
deleted file mode 100644
index 6bc8c7b..0000000
--- a/backend/dist/auth/middleware.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"middleware.d.ts","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,SAAS,CAAC;AACvD,OAAO,EAAc,YAAY,EAAe,MAAM,OAAO,CAAC;AAK9D;;;GAGG;AAGH,OAAO,QAAQ,SAAS,CAAC;IACvB,UAAU,cAAc;QACtB,IAAI,CAAC,EACD,CAAC,YAAY,GAAG;YACd,eAAe,EAAE,OAAO,CAAC;YACzB,EAAE,EAAE,MAAM,CAAC;SACZ,CAAC,GACF,SAAS,CAAC;KACf;CACF;AAsBD;;GAEG;AACH,eAAO,MAAM,YAAY,GAAU,SAAS,cAAc,EAAE,OAAO,YAAY,KAAG,OAAO,CAAC,IAAI,CAmE7F,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAC/B,SAAS,cAAc,EACvB,OAAO,YAAY,KAClB,OAAO,CAAC,IAAI,CAWd,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,GAAG,qBAAqB,MAAM,EAAE,MAC1C,SAAS,cAAc,EAAE,OAAO,YAAY,KAAG,OAAO,CAAC,IAAI,CA+B1E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,cAAc,GAAI,GAAG,cAAc,KAAK,CAAC,KAAK,GAAG,SAAS,GAAG,OAAO,CAAC,MAClE,SAAS,cAAc,EAAE,OAAO,YAAY,KAAG,OAAO,CAAC,IAAI,CAyB1E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,UAAU,YA9BE,cAAc,SAAS,YAAY,KAAG,OAAO,CAAC,IAAI,CA8B5B,CAAC;AAEhD;;GAEG;AACH,eAAO,MAAM,mBAAmB,YAnCP,cAAc,SAAS,YAAY,KAAG,OAAO,CAAC,IAAI,CAmCR,CAAC;AAEpE;;GAEG;AACH,eAAO,MAAM,sBAAsB,YA7EV,cAAc,SAAS,YAAY,KAAG,OAAO,CAAC,IAAI,CA6EA,CAAC;AAE5E;;GAEG;AACH,eAAO,MAAM,SAAS,GAAI,SAAS;IACjC,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,CAAC,OAAO,EAAE,cAAc,KAAK,MAAM,CAAC;IACnD,cAAc,CAAC,EAAE,OAAO,CAAC;IACzB,kBAAkB,CAAC,EAAE,OAAO,CAAC;CAC9B,MASe,SAAS,cAAc,EAAE,OAAO,YAAY,KAAG,OAAO,CAAC,IAAI,CA4C1E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,YAjDD,cAAc,SAAS,YAAY,KAAG,OAAO,CAAC,IAAI,CAqDzE,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,cAAc,YA1DF,cAAc,SAAS,YAAY,KAAG,OAAO,CAAC,IAAI,CA8DzE,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,YAAY,YAnEA,cAAc,SAAS,YAAY,KAAG,OAAO,CAAC,IAAI,CAuEzE,CAAC;AAEH;;GAEG;AACH,eAAO,MAAM,wBAAwB,GAAI,cAAa,MAAiB,MACvD,SAAS,cAAc,EAAE,OAAO,YAAY,KAAG,OAAO,CAAC,IAAI,CA6B1E,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,oBAAoB,GAC/B,SAAS,cAAc,EACvB,OAAO,YAAY,KAClB,OAAO,CAAC,IAAI,CAkDd,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,QAAQ,GAAU,SAAS,cAAc,EAAE,OAAO,YAAY,KAAG,OAAO,CAAC,IAAI,CAmCzF,CAAC"}
\ No newline at end of file
diff --git a/backend/dist/auth/middleware.js b/backend/dist/auth/middleware.js
deleted file mode 100644
index d196196..0000000
--- a/backend/dist/auth/middleware.js
+++ /dev/null
@@ -1,373 +0,0 @@
-"use strict";
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- var desc = Object.getOwnPropertyDescriptor(m, k);
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
- desc = { enumerable: true, get: function() { return m[k]; } };
- }
- Object.defineProperty(o, k2, desc);
-}) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
- o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || (function () {
- var ownKeys = function(o) {
- ownKeys = Object.getOwnPropertyNames || function (o) {
- var ar = [];
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
- return ar;
- };
- return ownKeys(o);
- };
- return function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
- __setModuleDefault(result, mod);
- return result;
- };
-})();
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.auditLog = exports.requireChannelAccess = exports.requireResourceOwnership = exports.apiRateLimit = exports.voiceRateLimit = exports.authRateLimit = exports.rateLimit = exports.authorizeVoiceCommands = exports.requireManagerOrCEO = exports.requireCEO = exports.authorizeRoles = exports.authorize = exports.optionalAuthenticate = exports.authenticate = void 0;
-const jwt_1 = require("./jwt");
-const index_1 = require("@db/index");
-const logger_1 = require("@utils/logger");
-const errors_1 = require("@utils/errors");
-/**
- * Rate limiting store (in production, use Redis)
- */
-const rateLimitStore = new Map();
-/**
- * Clean up expired rate limit entries
- */
-const cleanupRateLimit = () => {
- const now = Date.now();
- for (const [key, value] of rateLimitStore.entries()) {
- if (now > value.resetTime) {
- rateLimitStore.delete(key);
- }
- }
-};
-// Cleanup every 5 minutes
-setInterval(cleanupRateLimit, 5 * 60 * 1000);
-/**
- * Authentication middleware - validates JWT tokens
- */
-const authenticate = async (request, reply) => {
- try {
- const authHeader = request.headers.authorization;
- const token = jwt_1.jwtService.extractTokenFromHeader(authHeader);
- if (!token) {
- logger_1.securityLogger.logAuthEvent('missing_token', {
- ip: request.ip,
- userAgent: request.headers['user-agent'] ?? '',
- path: request.url,
- method: request.method,
- });
- throw new errors_1.AuthenticationError('Access token required');
- }
- // Verify token
- const payload = await jwt_1.jwtService.verifyAccessToken(token);
- // Additional security: verify user still exists and is active
- const user = await index_1.userRepository.findById(payload.userId);
- if (!user) {
- logger_1.securityLogger.logSecurityViolation('token_user_not_found', {
- userId: payload.userId,
- ip: request.ip,
- });
- throw new errors_1.AuthenticationError('User account not found');
- }
- if (user.deleted_at) {
- logger_1.securityLogger.logSecurityViolation('deleted_user_token', {
- userId: payload.userId,
- ip: request.ip,
- });
- throw new errors_1.AuthenticationError('User account has been deactivated');
- }
- // Update user's last active timestamp (async, don't wait)
- index_1.userRepository.updateLastActive(payload.userId).catch((error) => {
- logger_1.logger.warn?.({ error, userId: payload.userId }, 'Failed to update last active timestamp');
- });
- // Attach user to request
- request.user = {
- ...payload,
- isAuthenticated: true,
- id: payload.userId, // Add id alias for compatibility
- };
- logger_1.securityLogger.logAuthEvent('authentication_success', {
- userId: payload.userId,
- email: payload.email,
- role: payload.role,
- ip: request.ip,
- path: request.url,
- method: request.method,
- });
- }
- catch (error) {
- if (error instanceof errors_1.AuthenticationError) {
- throw error;
- }
- logger_1.logger.error({ error }, 'Authentication middleware error');
- throw new errors_1.AuthenticationError('Authentication failed');
- }
-};
-exports.authenticate = authenticate;
-/**
- * Optional authentication middleware - doesn't throw if no token
- */
-const optionalAuthenticate = async (request, reply) => {
- try {
- await (0, exports.authenticate)(request, reply);
- }
- catch (error) {
- // Don't throw, just log the attempt
- logger_1.logger.debug({ error: error instanceof Error ? error.message : String(error) }, 'Optional authentication failed');
- request.user = undefined;
- }
-};
-exports.optionalAuthenticate = optionalAuthenticate;
-/**
- * Authorization middleware factory - checks permissions
- */
-const authorize = (...requiredPermissions) => {
- return async (request, reply) => {
- if (!request.user || !request.user.isAuthenticated) {
- throw new errors_1.AuthenticationError('Authentication required for this resource');
- }
- const hasPermission = requiredPermissions.length === 0 ||
- jwt_1.jwtService.hasAnyPermission(request.user, requiredPermissions);
- if (!hasPermission) {
- logger_1.securityLogger.logAuthzEvent('access_denied', {
- userId: request.user.userId,
- requiredPermissions,
- userPermissions: request.user.permissions,
- resource: request.url,
- action: request.method,
- ip: request.ip,
- });
- throw new errors_1.AuthorizationError(`Insufficient permissions. Required: ${requiredPermissions.join(', ')}`);
- }
- logger_1.securityLogger.logAuthzEvent('access_granted', {
- userId: request.user.userId,
- resource: request.url,
- action: request.method,
- ip: request.ip,
- });
- };
-};
-exports.authorize = authorize;
-/**
- * Role-based authorization middleware
- */
-const authorizeRoles = (...allowedRoles) => {
- return async (request, reply) => {
- if (!request.user || !request.user.isAuthenticated) {
- throw new errors_1.AuthenticationError('Authentication required for this resource');
- }
- if (!allowedRoles.includes(request.user.role)) {
- logger_1.securityLogger.logAuthzEvent('access_denied', {
- userId: request.user.userId,
- userRole: request.user.role,
- allowedRoles,
- resource: request.url,
- action: request.method,
- ip: request.ip,
- });
- throw new errors_1.AuthorizationError(`Access denied. Required roles: ${allowedRoles.join(', ')}`);
- }
- logger_1.securityLogger.logAuthzEvent('access_granted', {
- userId: request.user.userId,
- resource: request.url,
- action: request.method,
- ip: request.ip,
- });
- };
-};
-exports.authorizeRoles = authorizeRoles;
-/**
- * CEO-only middleware
- */
-exports.requireCEO = (0, exports.authorizeRoles)('ceo');
-/**
- * Manager or CEO middleware
- */
-exports.requireManagerOrCEO = (0, exports.authorizeRoles)('ceo', 'manager');
-/**
- * Voice commands authorization (CEO only feature)
- */
-exports.authorizeVoiceCommands = (0, exports.authorize)(jwt_1.PERMISSIONS.VOICE_COMMANDS);
-/**
- * Rate limiting middleware
- */
-const rateLimit = (options) => {
- const { maxRequests, windowMs, keyGenerator = (req) => req.ip, skipSuccessful = false, skipFailedRequests = false, } = options;
- return async (request, reply) => {
- const key = keyGenerator(request);
- const now = Date.now();
- const resetTime = now + windowMs;
- let rateLimitInfo = rateLimitStore.get(key);
- if (!rateLimitInfo || now > rateLimitInfo.resetTime) {
- rateLimitInfo = { count: 0, resetTime };
- rateLimitStore.set(key, rateLimitInfo);
- }
- rateLimitInfo.count++;
- if (rateLimitInfo.count > maxRequests) {
- logger_1.securityLogger.logSecurityViolation('rate_limit_exceeded', {
- key,
- ip: request.ip,
- path: request.url,
- count: rateLimitInfo.count,
- maxRequests,
- userId: request.user?.userId,
- });
- const retryAfter = Math.ceil((rateLimitInfo.resetTime - now) / 1000);
- reply.header('Retry-After', retryAfter.toString());
- reply.header('X-RateLimit-Limit', maxRequests.toString());
- reply.header('X-RateLimit-Remaining', '0');
- reply.header('X-RateLimit-Reset', Math.ceil(rateLimitInfo.resetTime / 1000).toString());
- throw new errors_1.RateLimitError('Rate limit exceeded. Too many requests.', retryAfter, {
- maxRequests,
- windowMs,
- currentCount: rateLimitInfo.count,
- });
- }
- // Set rate limit headers
- const remaining = Math.max(0, maxRequests - rateLimitInfo.count);
- reply.header('X-RateLimit-Limit', maxRequests.toString());
- reply.header('X-RateLimit-Remaining', remaining.toString());
- reply.header('X-RateLimit-Reset', Math.ceil(rateLimitInfo.resetTime / 1000).toString());
- };
-};
-exports.rateLimit = rateLimit;
-/**
- * Strict rate limiting for authentication endpoints
- */
-exports.authRateLimit = (0, exports.rateLimit)({
- maxRequests: 5, // 5 attempts
- windowMs: 15 * 60 * 1000, // 15 minutes
- keyGenerator: (req) => `auth:${req.ip}`,
-});
-/**
- * Voice processing rate limiting
- */
-exports.voiceRateLimit = (0, exports.rateLimit)({
- maxRequests: 60, // 60 commands per hour
- windowMs: 60 * 60 * 1000, // 1 hour
- keyGenerator: (req) => `voice:${req.user?.userId || req.ip}`,
-});
-/**
- * API rate limiting for general endpoints
- */
-exports.apiRateLimit = (0, exports.rateLimit)({
- maxRequests: 1000, // 1000 requests per hour
- windowMs: 60 * 60 * 1000, // 1 hour
- keyGenerator: (req) => `api:${req.user?.userId || req.ip}`,
-});
-/**
- * Resource ownership middleware - ensures user can only access their own resources
- */
-const requireResourceOwnership = (userIdParam = 'userId') => {
- return async (request, reply) => {
- if (!request.user || !request.user.isAuthenticated) {
- throw new errors_1.AuthenticationError('Authentication required');
- }
- // CEO can access any resource
- if (request.user.role === 'ceo') {
- return;
- }
- const requestedUserId = request.params[userIdParam];
- if (!requestedUserId) {
- throw new errors_1.AuthorizationError('Resource user ID not specified');
- }
- if (request.user.userId !== requestedUserId) {
- logger_1.securityLogger.logAuthzEvent('access_denied', {
- userId: request.user.userId,
- requestedUserId,
- resource: request.url,
- action: request.method,
- ip: request.ip,
- reason: 'resource_ownership_violation',
- });
- throw new errors_1.AuthorizationError('You can only access your own resources');
- }
- };
-};
-exports.requireResourceOwnership = requireResourceOwnership;
-/**
- * Channel membership middleware - ensures user has access to channel
- */
-const requireChannelAccess = async (request, reply) => {
- if (!request.user || !request.user.isAuthenticated) {
- throw new errors_1.AuthenticationError('Authentication required');
- }
- // Check for channel ID in different parameter names used in routes
- const channelId = request.params.channelId ||
- request.params.id ||
- request.body?.channelId;
- if (!channelId) {
- throw new errors_1.AuthorizationError('Channel ID not specified');
- }
- // CEO can access any channel
- if (request.user.role === 'ceo') {
- return;
- }
- try {
- const { channelRepository } = await Promise.resolve().then(() => __importStar(require('@db/index')));
- const hasAccess = await channelRepository.canUserAccess(channelId, request.user.userId, request.user.role);
- if (!hasAccess) {
- logger_1.securityLogger.logAuthzEvent('access_denied', {
- userId: request.user.userId,
- channelId,
- resource: request.url,
- action: request.method,
- ip: request.ip,
- reason: 'channel_access_denied',
- });
- throw new errors_1.AuthorizationError('You do not have access to this channel');
- }
- }
- catch (error) {
- if (error instanceof errors_1.AuthorizationError) {
- throw error;
- }
- logger_1.logger.error({ error, channelId, userId: request.user.userId }, 'Error checking channel access');
- throw new errors_1.AuthorizationError('Unable to verify channel access');
- }
-};
-exports.requireChannelAccess = requireChannelAccess;
-/**
- * Audit logging middleware - logs all requests for security audit
- */
-const auditLog = async (request, reply) => {
- const startTime = Date.now();
- // Log request
- logger_1.logger.info({
- method: request.method,
- url: request.url,
- ip: request.ip,
- userAgent: request.headers['user-agent'],
- userId: request.user?.userId,
- userRole: request.user?.role,
- timestamp: new Date().toISOString(),
- }, 'API Request');
- // Log response when request completes
- request.server.addHook('onSend', async (request, reply, payload) => {
- const duration = Date.now() - startTime;
- logger_1.logger.info({
- method: request.method,
- url: request.url,
- statusCode: reply.statusCode,
- duration,
- userId: request.user?.userId,
- timestamp: new Date().toISOString(),
- }, 'API Response');
- return payload;
- });
-};
-exports.auditLog = auditLog;
-//# sourceMappingURL=middleware.js.map
\ No newline at end of file
diff --git a/backend/dist/auth/middleware.js.map b/backend/dist/auth/middleware.js.map
deleted file mode 100644
index 90051e7..0000000
--- a/backend/dist/auth/middleware.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"middleware.js","sourceRoot":"","sources":["../../src/auth/middleware.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/auth/routes.d.ts b/backend/dist/auth/routes.d.ts
deleted file mode 100644
index 8d83c2f..0000000
--- a/backend/dist/auth/routes.d.ts
+++ /dev/null
@@ -1,6 +0,0 @@
-import { FastifyInstance } from 'fastify';
-/**
- * Register authentication routes
- */
-export declare const registerAuthRoutes: (fastify: FastifyInstance) => Promise;
-//# sourceMappingURL=routes.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/auth/routes.d.ts.map b/backend/dist/auth/routes.d.ts.map
deleted file mode 100644
index adfee3a..0000000
--- a/backend/dist/auth/routes.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../src/auth/routes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAgC,MAAM,SAAS,CAAC;AA6DxE;;GAEG;AACH,eAAO,MAAM,kBAAkB,GAAU,SAAS,eAAe,kBA4uBhE,CAAC"}
\ No newline at end of file
diff --git a/backend/dist/auth/routes.js b/backend/dist/auth/routes.js
deleted file mode 100644
index 35e6e33..0000000
--- a/backend/dist/auth/routes.js
+++ /dev/null
@@ -1,715 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.registerAuthRoutes = void 0;
-const jwt_1 = require("./jwt");
-const index_1 = require("@db/index");
-const logger_1 = require("@utils/logger");
-const errors_1 = require("@utils/errors");
-const middleware_1 = require("./middleware");
-const typebox_1 = require("@sinclair/typebox");
-const crypto_1 = __importDefault(require("crypto"));
-const EmailService_1 = require("@/services/EmailService");
-/**
- * Authentication routes for the CEO Communication Platform
- * Includes login, registration, password reset, and token management
- */
-// Request/Response schemas
-const LoginSchema = typebox_1.Type.Object({
- email: typebox_1.Type.String({ format: 'email' }),
- password: typebox_1.Type.String({ minLength: 1 }),
-});
-const RegisterSchema = typebox_1.Type.Object({
- email: typebox_1.Type.String({ format: 'email' }),
- password: typebox_1.Type.String({ minLength: 8 }),
- name: typebox_1.Type.String({ minLength: 1, maxLength: 255 }),
- role: typebox_1.Type.Union([typebox_1.Type.Literal('ceo'), typebox_1.Type.Literal('manager'), typebox_1.Type.Literal('staff')]),
- department: typebox_1.Type.Optional(typebox_1.Type.String()),
- job_title: typebox_1.Type.Optional(typebox_1.Type.String()),
- phone: typebox_1.Type.Optional(typebox_1.Type.String()),
-});
-const RefreshTokenSchema = typebox_1.Type.Object({
- refreshToken: typebox_1.Type.String(),
-});
-const PasswordResetRequestSchema = typebox_1.Type.Object({
- email: typebox_1.Type.String({ format: 'email' }),
-});
-const PasswordResetSchema = typebox_1.Type.Object({
- token: typebox_1.Type.String(),
- newPassword: typebox_1.Type.String({ minLength: 8 }),
-});
-const ChangePasswordSchema = typebox_1.Type.Object({
- currentPassword: typebox_1.Type.String(),
- newPassword: typebox_1.Type.String({ minLength: 8 }),
-});
-/**
- * Register authentication routes
- */
-const registerAuthRoutes = async (fastify) => {
- /**
- * POST /auth/login - User login
- */
- fastify.post('/auth/login', {
- preHandler: [middleware_1.authRateLimit],
- schema: {
- tags: ['Authentication'],
- summary: 'User Login',
- description: 'Authenticate user with email and password to receive JWT tokens',
- body: LoginSchema,
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: typebox_1.Type.Object({
- accessToken: typebox_1.Type.String(),
- refreshToken: typebox_1.Type.String(),
- expiresIn: typebox_1.Type.Number(),
- user: typebox_1.Type.Object({
- id: typebox_1.Type.String(),
- email: typebox_1.Type.String(),
- name: typebox_1.Type.String(),
- role: typebox_1.Type.String(),
- avatar_url: typebox_1.Type.Optional(typebox_1.Type.String()),
- email_verified: typebox_1.Type.Boolean(),
- permissions: typebox_1.Type.Array(typebox_1.Type.String()),
- }),
- }),
- }),
- 400: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String(),
- }),
- }),
- 401: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String(),
- }),
- }),
- },
- },
- }, async (request, reply) => {
- const { email, password } = request.body;
- const context = (0, errors_1.createErrorContext)({
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role,
- },
- }),
- });
- try {
- logger_1.securityLogger.logAuthEvent('login_attempt', {
- email,
- ip: request.ip,
- userAgent: request.headers['user-agent'] ?? '',
- });
- // Verify credentials
- const user = await index_1.userRepository.verifyPassword(email, password);
- if (!user) {
- logger_1.securityLogger.logAuthEvent('failed_login', {
- email,
- ip: request.ip,
- reason: 'invalid_credentials',
- });
- throw new errors_1.AuthenticationError('Invalid email or password');
- }
- // Log if user is not verified (but don't prevent login)
- if (!user.email_verified) {
- logger_1.securityLogger.logAuthEvent('login_attempt', {
- email,
- ip: request.ip,
- reason: 'email_not_verified',
- });
- }
- // Generate tokens
- const tokens = await jwt_1.jwtService.generateTokens({
- id: user.id,
- email: user.email,
- role: user.role,
- name: user.name,
- });
- logger_1.securityLogger.logAuthEvent('login', {
- userId: user.id,
- email: user.email,
- ip: request.ip,
- userAgent: request.headers['user-agent'] ?? '',
- });
- const responseData = {
- success: true,
- data: {
- ...tokens,
- user: {
- id: user.id,
- email: user.email,
- name: user.name,
- role: user.role,
- avatar_url: user.avatar_url,
- email_verified: user.email_verified,
- permissions: jwt_1.jwtService.decodeToken(tokens.accessToken)?.permissions || [],
- },
- },
- };
- logger_1.logger.info({
- responseData: JSON.stringify(responseData).substring(0, 200) + '...',
- contentLength: JSON.stringify(responseData).length,
- userId: user.id
- }, 'Sending login response');
- reply.code(200).send(responseData);
- }
- catch (error) {
- logger_1.logger.error({ error, context }, 'Login failed');
- if (error instanceof errors_1.AuthenticationError || error instanceof errors_1.ValidationError) {
- reply.code(401).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Login failed due to server error',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * POST /auth/register - User registration
- */
- fastify.post('/auth/register', {
- preHandler: [middleware_1.authRateLimit],
- schema: {
- tags: ['Authentication'],
- summary: 'User Registration',
- description: 'Register a new user account with email verification',
- body: RegisterSchema,
- response: {
- 201: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: typebox_1.Type.Object({
- user: typebox_1.Type.Object({
- id: typebox_1.Type.String(),
- email: typebox_1.Type.String(),
- name: typebox_1.Type.String(),
- role: typebox_1.Type.String(),
- }),
- message: typebox_1.Type.String(),
- }),
- }),
- 400: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String(),
- }),
- }),
- 409: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String(),
- }),
- }),
- },
- },
- }, async (request, reply) => {
- const userData = request.body;
- const context = (0, errors_1.createErrorContext)({
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role,
- },
- }),
- });
- try {
- logger_1.securityLogger.logAuthEvent('registration_attempt', {
- email: userData.email,
- role: userData.role,
- ip: request.ip,
- });
- // Create user
- const user = await index_1.userRepository.createUser({
- ...userData,
- // Self-registration: do not set created_by
- });
- // Generate email verification token
- const verificationToken = jwt_1.jwtService.generateEmailVerificationToken(user.id, user.email);
- await index_1.userRepository.setEmailVerificationToken(user.id, verificationToken);
- // Send verification email
- const emailSent = await EmailService_1.emailService.sendEmailVerification({
- userEmail: user.email,
- userName: user.name,
- verificationToken,
- });
- if (!emailSent) {
- logger_1.logger.warn({ userId: user.id, email: user.email }, 'Failed to send verification email');
- }
- logger_1.securityLogger.logAuthEvent('registration_success', {
- userId: user.id,
- email: user.email,
- role: user.role,
- ip: request.ip,
- emailSent,
- });
- reply.code(201).send({
- success: true,
- data: {
- user: {
- id: user.id,
- email: user.email,
- name: user.name,
- role: user.role,
- },
- message: 'Account created successfully. Please check your email for verification instructions.',
- },
- });
- }
- catch (error) {
- logger_1.logger.error({ error, context }, 'Registration failed');
- if (error instanceof errors_1.ConflictError) {
- reply.code(409).send((0, errors_1.formatErrorResponse)(error));
- }
- else if (error instanceof errors_1.ValidationError) {
- reply.code(400).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Registration failed due to server error',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * POST /auth/refresh - Refresh access token
- */
- fastify.post('/auth/refresh', {
- schema: {
- body: RefreshTokenSchema,
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: typebox_1.Type.Object({
- accessToken: typebox_1.Type.String(),
- refreshToken: typebox_1.Type.String(),
- expiresIn: typebox_1.Type.Number(),
- }),
- }),
- 401: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String(),
- }),
- }),
- },
- },
- }, async (request, reply) => {
- const { refreshToken } = request.body;
- const context = (0, errors_1.createErrorContext)({
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- ...(request.user && {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role,
- },
- }),
- });
- try {
- const tokens = await jwt_1.jwtService.refreshTokens(refreshToken);
- reply.code(200).send({
- success: true,
- data: tokens,
- });
- }
- catch (error) {
- logger_1.logger.error({ error, context }, 'Token refresh failed');
- if (error instanceof errors_1.AuthenticationError) {
- reply.code(401).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Token refresh failed',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * POST /auth/logout - User logout (invalidate tokens - would need Redis blacklist in production)
- */
- fastify.post('/auth/logout', async (request, reply) => {
- // In production, add token to blacklist in Redis
- // For now, just log the logout
- if (request.user) {
- logger_1.securityLogger.logAuthEvent('logout', {
- userId: request.user.userId,
- ip: request.ip,
- });
- }
- reply.code(200).send({
- success: true,
- message: 'Logged out successfully',
- });
- });
- /**
- * POST /auth/password-reset-request - Request password reset
- */
- fastify.post('/auth/password-reset-request', {
- preHandler: [middleware_1.authRateLimit],
- schema: {
- body: PasswordResetRequestSchema,
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- message: typebox_1.Type.String(),
- }),
- },
- },
- }, async (request, reply) => {
- const { email } = request.body;
- try {
- // Generate reset token
- const resetToken = crypto_1.default.randomBytes(32).toString('hex');
- // Save token (expires in 1 hour)
- const tokenSet = await index_1.userRepository.setPasswordResetToken(email, resetToken, '1 hour');
- if (tokenSet) {
- // Get user details for the email
- const user = await index_1.userRepository.findByEmail(email);
- if (user) {
- // Send password reset email
- const emailSent = await EmailService_1.emailService.sendPasswordReset({
- userEmail: user.email,
- userName: user.name,
- resetToken,
- });
- if (!emailSent) {
- logger_1.logger.warn({ email, userId: user.id }, 'Failed to send password reset email');
- }
- logger_1.securityLogger.logAuthEvent('password_reset_requested', {
- email,
- userId: user.id,
- ip: request.ip,
- emailSent,
- });
- }
- logger_1.logger.info({ email, resetToken }, 'Password reset token generated');
- }
- // Always return success (don't reveal if email exists)
- reply.code(200).send({
- success: true,
- message: 'If the email address exists, you will receive password reset instructions.',
- });
- }
- catch (error) {
- logger_1.logger.error({ error, email }, 'Password reset request failed');
- // Still return success to prevent email enumeration
- reply.code(200).send({
- success: true,
- message: 'If the email address exists, you will receive password reset instructions.',
- });
- }
- });
- /**
- * POST /auth/password-reset - Reset password with token
- */
- fastify.post('/auth/password-reset', {
- preHandler: [middleware_1.authRateLimit],
- schema: {
- body: PasswordResetSchema,
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- message: typebox_1.Type.String(),
- }),
- 400: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String(),
- }),
- }),
- },
- },
- }, async (request, reply) => {
- const { token, newPassword } = request.body;
- const context = (0, errors_1.createErrorContext)({
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- ...(request.user &&
- typeof request.user === 'object' &&
- 'email' in request.user &&
- 'role' in request.user
- ? {
- user: {
- id: request.user.id,
- email: request.user.email,
- role: request.user.role,
- },
- }
- : {}),
- });
- try {
- // Verify token
- const user = await index_1.userRepository.verifyPasswordResetToken(token);
- if (!user) {
- throw new errors_1.AuthenticationError('Invalid or expired password reset token');
- }
- // Update password
- const success = await index_1.userRepository.updatePassword(user.id, newPassword);
- if (!success) {
- throw new errors_1.ValidationError('Failed to update password', []);
- }
- logger_1.securityLogger.logAuthEvent('password_reset', {
- userId: user.id,
- email: user.email,
- ip: request.ip,
- });
- reply.code(200).send({
- success: true,
- message: 'Password has been reset successfully. You can now log in with your new password.',
- });
- }
- catch (error) {
- logger_1.logger.error({ error, context }, 'Password reset failed');
- if (error instanceof errors_1.AuthenticationError || error instanceof errors_1.ValidationError) {
- reply.code(400).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Password reset failed',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * GET /auth/verify-email/:token - Verify email address
- */
- fastify.get('/auth/verify-email/:token', async (request, reply) => {
- const { token } = request.params;
- try {
- const user = await index_1.userRepository.verifyEmail(token);
- if (!user) {
- throw new errors_1.AuthenticationError('Invalid or expired email verification token');
- }
- logger_1.securityLogger.logAuthEvent('email_verified', {
- userId: user.id,
- email: user.email,
- ip: request.ip,
- });
- reply.code(200).send({
- success: true,
- message: 'Email address verified successfully. You can now log in.',
- });
- }
- catch (error) {
- logger_1.logger.error({ error, token }, 'Email verification failed');
- reply.code(400).send({
- error: {
- message: 'Invalid or expired verification token',
- code: 'INVALID_TOKEN',
- },
- });
- }
- });
- /**
- * GET /auth/me - Get current user profile
- */
- fastify.get('/auth/me', {
- preHandler: [fastify.authenticate],
- schema: {
- tags: ['Authentication'],
- summary: 'Get Current User',
- description: 'Get the profile information of the currently authenticated user',
- security: [{ BearerAuth: [] }],
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- data: typebox_1.Type.Object({
- user: typebox_1.Type.Object({
- id: typebox_1.Type.String({ format: 'uuid' }),
- email: typebox_1.Type.String({ format: 'email' }),
- name: typebox_1.Type.String(),
- role: typebox_1.Type.String({ enum: ['ceo', 'manager', 'staff'] }),
- avatar_url: typebox_1.Type.Union([typebox_1.Type.String({ format: 'uri' }), typebox_1.Type.Null()]),
- department: typebox_1.Type.Union([typebox_1.Type.String(), typebox_1.Type.Null()]),
- job_title: typebox_1.Type.Union([typebox_1.Type.String(), typebox_1.Type.Null()]),
- phone: typebox_1.Type.Union([typebox_1.Type.String(), typebox_1.Type.Null()]),
- language_preference: typebox_1.Type.Union([typebox_1.Type.String(), typebox_1.Type.Null()]),
- timezone: typebox_1.Type.Union([typebox_1.Type.String(), typebox_1.Type.Null()]),
- notification_settings: typebox_1.Type.Any(),
- voice_settings: typebox_1.Type.Any(),
- email_verified: typebox_1.Type.Boolean(),
- last_active: typebox_1.Type.Union([typebox_1.Type.String({ format: 'date-time' }), typebox_1.Type.Null()]),
- created_at: typebox_1.Type.String({ format: 'date-time' }),
- updated_at: typebox_1.Type.Union([typebox_1.Type.String({ format: 'date-time' }), typebox_1.Type.Null()]),
- permissions: typebox_1.Type.Array(typebox_1.Type.String()),
- }),
- }),
- }),
- 401: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String(),
- }),
- }),
- },
- },
- }, async (request, reply) => {
- if (!request.user) {
- throw new errors_1.AuthenticationError('Authentication required');
- }
- try {
- const user = await index_1.userRepository.findById(request.user.userId);
- if (!user) {
- throw new errors_1.AuthenticationError('User not found');
- }
- reply.code(200).send({
- success: true,
- data: {
- user: {
- id: user.id,
- email: user.email,
- name: user.name,
- role: user.role,
- avatar_url: user.avatar_url,
- department: user.department,
- job_title: user.job_title,
- phone: user.phone,
- language_preference: user.language_preference,
- timezone: user.timezone,
- notification_settings: user.notification_settings,
- voice_settings: user.voice_settings,
- email_verified: user.email_verified,
- last_active: user.last_active,
- created_at: user.created_at,
- updated_at: user.updated_at,
- permissions: request.user.permissions,
- },
- },
- });
- }
- catch (error) {
- logger_1.logger.error({ error, userId: request.user.userId }, 'Get profile failed');
- if (error instanceof errors_1.AuthenticationError) {
- reply.code(401).send((0, errors_1.formatErrorResponse)(error));
- }
- else {
- reply.code(500).send({
- error: {
- message: 'Failed to get user profile',
- code: 'SERVER_ERROR',
- },
- });
- }
- }
- });
- /**
- * POST /auth/resend-verification - Resend email verification
- */
- fastify.post('/auth/resend-verification', {
- preHandler: [middleware_1.authRateLimit],
- schema: {
- tags: ['Authentication'],
- summary: 'Resend Email Verification',
- description: 'Resend email verification link to the specified email address',
- body: typebox_1.Type.Object({
- email: typebox_1.Type.String({ format: 'email' }),
- }),
- response: {
- 200: typebox_1.Type.Object({
- success: typebox_1.Type.Boolean(),
- message: typebox_1.Type.String(),
- }),
- 400: typebox_1.Type.Object({
- error: typebox_1.Type.Object({
- message: typebox_1.Type.String(),
- code: typebox_1.Type.String(),
- }),
- }),
- },
- },
- }, async (request, reply) => {
- const { email } = request.body;
- const context = (0, errors_1.createErrorContext)({
- ip: request.ip,
- method: request.method,
- url: request.url,
- headers: request.headers,
- });
- try {
- // Check if user exists with this email
- const user = await index_1.userRepository.findByEmail(email);
- if (!user) {
- // Don't reveal that the email doesn't exist for security reasons
- reply.code(200).send({
- success: true,
- message: 'If the email address exists, a new verification email will be sent.',
- });
- return;
- }
- // Check if user is already verified
- if (user.email_verified) {
- reply.code(200).send({
- success: true,
- message: 'Email address is already verified.',
- });
- return;
- }
- // Generate new email verification token
- const verificationToken = jwt_1.jwtService.generateEmailVerificationToken(user.id, user.email);
- await index_1.userRepository.setEmailVerificationToken(user.id, verificationToken);
- // Send verification email
- const emailSent = await EmailService_1.emailService.sendEmailVerification({
- userEmail: user.email,
- userName: user.name,
- verificationToken,
- });
- if (!emailSent) {
- logger_1.logger.warn({ userId: user.id, email: user.email }, 'Failed to send verification email');
- }
- logger_1.securityLogger.logAuthEvent('email_verified', {
- userId: user.id,
- email: user.email,
- ip: request.ip,
- emailSent,
- });
- reply.code(200).send({
- success: true,
- message: 'Verification email sent successfully. Please check your inbox and spam folder.',
- });
- }
- catch (error) {
- logger_1.logger.error({ error, context, email }, 'Resend verification failed');
- reply.code(500).send({
- error: {
- message: 'Failed to resend verification email',
- code: 'SERVER_ERROR',
- },
- });
- }
- });
-};
-exports.registerAuthRoutes = registerAuthRoutes;
-//# sourceMappingURL=routes.js.map
\ No newline at end of file
diff --git a/backend/dist/auth/routes.js.map b/backend/dist/auth/routes.js.map
deleted file mode 100644
index 1d8fc96..0000000
--- a/backend/dist/auth/routes.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"routes.js","sourceRoot":"","sources":["../../src/auth/routes.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/config/database.d.ts b/backend/dist/config/database.d.ts
deleted file mode 100644
index fc5b178..0000000
--- a/backend/dist/config/database.d.ts
+++ /dev/null
@@ -1,65 +0,0 @@
-import { Pool, PoolClient } from 'pg';
-/**
- * Initialize the database connection pool
- */
-export declare const initializeDatabase: () => Promise;
-/**
- * Get the database connection pool
- */
-export declare const getPool: () => Pool;
-/**
- * Execute a query with performance monitoring
- */
-export declare const query: (text: string, params?: any[], client?: PoolClient) => Promise<{
- rows: T[];
- rowCount: number;
-}>;
-/**
- * Execute a transaction with automatic rollback on errors
- */
-export declare const transaction: (callback: (client: PoolClient) => Promise) => Promise;
-/**
- * Check database health and connection status
- */
-export declare const healthCheck: () => Promise<{
- status: "healthy" | "unhealthy";
- details: {
- connected: boolean;
- poolStats: {
- total: number;
- idle: number;
- waiting: number;
- };
- queryTime?: number;
- error?: string;
- };
-}>;
-/**
- * Gracefully close the database connection pool
- */
-export declare const closeDatabase: () => Promise;
-/**
- * Get current pool statistics for monitoring
- */
-export declare const getPoolStats: () => {
- total: number;
- idle: number;
- waiting: number;
- connected: boolean;
-};
-export declare const databaseMetrics: {
- /**
- * Log slow queries for optimization
- */
- logSlowQuery: (queryText: string, duration: number, params?: any[]) => void;
- /**
- * Monitor connection pool health
- */
- monitorPoolHealth: () => void;
-};
-export type DatabaseClient = PoolClient;
-export type QueryResult = {
- rows: T[];
- rowCount: number;
-};
-//# sourceMappingURL=database.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/config/database.d.ts.map b/backend/dist/config/database.d.ts.map
deleted file mode 100644
index 7fec64b..0000000
--- a/backend/dist/config/database.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"database.d.ts","sourceRoot":"","sources":["../../src/config/database.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,IAAI,EAAE,UAAU,EAAc,MAAM,IAAI,CAAC;AAyClD;;GAEG;AACH,eAAO,MAAM,kBAAkB,QAAa,OAAO,CAAC,IAAI,CAyDvD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,OAAO,QAAO,IAK1B,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,KAAK,GAAU,CAAC,GAAG,GAAG,EACjC,MAAM,MAAM,EACZ,SAAS,GAAG,EAAE,EACd,SAAS,UAAU,KAClB,OAAO,CAAC;IAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CA8CzC,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,GAAU,CAAC,EAAE,UAAU,CAAC,MAAM,EAAE,UAAU,KAAK,OAAO,CAAC,CAAC,CAAC,KAAG,OAAO,CAAC,CAAC,CA2B5F,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,WAAW,QAAa,OAAO,CAAC;IAC3C,MAAM,EAAE,SAAS,GAAG,WAAW,CAAC;IAChC,OAAO,EAAE;QACP,SAAS,EAAE,OAAO,CAAC;QACnB,SAAS,EAAE;YACT,KAAK,EAAE,MAAM,CAAC;YACd,IAAI,EAAE,MAAM,CAAC;YACb,OAAO,EAAE,MAAM,CAAC;SACjB,CAAC;QACF,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,KAAK,CAAC,EAAE,MAAM,CAAC;KAChB,CAAC;CACH,CA6CA,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,aAAa,QAAa,OAAO,CAAC,IAAI,CAOlD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,YAAY;;;;;CAgBxB,CAAC;AAGF,eAAO,MAAM,eAAe;IAC1B;;OAEG;8BACuB,MAAM,YAAY,MAAM,WAAW,GAAG,EAAE;IAelE;;OAEG;;CA0BJ,CAAC;AAGF,MAAM,MAAM,cAAc,GAAG,UAAU,CAAC;AACxC,MAAM,MAAM,WAAW,CAAC,CAAC,GAAG,GAAG,IAAI;IAAE,IAAI,EAAE,CAAC,EAAE,CAAC;IAAC,QAAQ,EAAE,MAAM,CAAA;CAAE,CAAC"}
\ No newline at end of file
diff --git a/backend/dist/config/database.js b/backend/dist/config/database.js
deleted file mode 100644
index d3833f2..0000000
--- a/backend/dist/config/database.js
+++ /dev/null
@@ -1,268 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.databaseMetrics = exports.getPoolStats = exports.closeDatabase = exports.healthCheck = exports.transaction = exports.query = exports.getPool = exports.initializeDatabase = void 0;
-const pg_1 = require("pg");
-const index_1 = require("./index");
-const logger_1 = require("@utils/logger");
-const errors_1 = require("@utils/errors");
-/**
- * Database configuration and connection management
- * Optimized for high-performance concurrent operations with voice processing
- */
-// Enhanced pool configuration for CEO platform requirements
-const poolConfig = {
- connectionString: index_1.config.database.url,
- min: index_1.config.database.pool.min,
- max: index_1.config.database.pool.max,
- // Connection lifecycle settings
- idleTimeoutMillis: 30000, // 30 seconds idle timeout
- connectionTimeoutMillis: 10000, // 10 seconds connection timeout
- maxUses: 7500, // Maximum uses per connection before recycling
- // SSL configuration for production and AWS RDS
- ssl: index_1.config.app.isProduction || index_1.config.database.url.includes('rds.amazonaws.com')
- ? {
- rejectUnauthorized: false, // Configure properly in production
- }
- : false,
- // Query timeout settings
- query_timeout: 30000, // 30 seconds max query time
- statement_timeout: 30000, // Statement timeout
- // Performance optimizations
- application_name: 'ceo-communication-platform',
- // Error handling
-};
-// Global connection pool
-let pool = null;
-/**
- * Initialize the database connection pool
- */
-const initializeDatabase = async () => {
- try {
- pool = new pg_1.Pool(poolConfig);
- // Set up connection pool event handlers
- pool.on('connect', (client) => {
- logger_1.logger.debug({
- totalCount: pool?.totalCount,
- idleCount: pool?.idleCount,
- waitingCount: pool?.waitingCount,
- }, 'Database client connected');
- });
- pool.on('acquire', (client) => {
- logger_1.logger.debug('Database client acquired from pool');
- });
- pool.on('remove', (client) => {
- logger_1.logger.debug('Database client removed from pool');
- });
- pool.on('error', (err, client) => {
- logger_1.logger.error({ error: err }, 'Database pool error');
- });
- // Test the connection
- const client = await pool.connect();
- // Optimize connection settings for performance
- await client.query(`
- SET timezone = 'UTC';
- SET statement_timeout = '30s';
- SET lock_timeout = '10s';
- SET idle_in_transaction_session_timeout = '60s';
- SET search_path = app, public;
- `);
- // Test query to verify everything is working
- const result = await client.query('SELECT NOW() as current_time, version() as pg_version');
- client.release();
- logger_1.logger.info({
- poolSize: pool.totalCount,
- currentTime: result.rows[0].current_time,
- postgresVersion: result.rows[0].pg_version,
- }, 'Database initialized');
- }
- catch (error) {
- logger_1.logger.error({ error }, 'Failed to initialize database connection pool');
- throw new errors_1.DatabaseConnectionError('Failed to connect to database', { error });
- }
-};
-exports.initializeDatabase = initializeDatabase;
-/**
- * Get the database connection pool
- */
-const getPool = () => {
- if (!pool) {
- throw new errors_1.DatabaseConnectionError('Database pool not initialized');
- }
- return pool;
-};
-exports.getPool = getPool;
-/**
- * Execute a query with performance monitoring
- */
-const query = async (text, params, client) => {
- const queryClient = client || pool;
- if (!queryClient) {
- throw new errors_1.DatabaseConnectionError('No database connection available');
- }
- return logger_1.performanceLogger.trackAsyncOperation(async () => {
- try {
- const result = await queryClient.query(text, params);
- if (index_1.config.development.debugSql) {
- logger_1.logger.debug({
- query: text,
- params: params,
- rowCount: result.rowCount,
- }, 'SQL Query executed');
- }
- return {
- rows: result.rows,
- rowCount: result.rowCount || 0,
- };
- }
- catch (error) {
- logger_1.logger.error({
- error,
- query: text,
- params: params,
- }, 'Database query failed');
- throw new errors_1.DatabaseError(`Database query failed: ${error instanceof Error ? error.message : 'Unknown error'}`, { query: text, params });
- }
- }, 'database-query', { query: text.substring(0, 100) + (text.length > 100 ? '...' : '') });
-};
-exports.query = query;
-/**
- * Execute a transaction with automatic rollback on errors
- */
-const transaction = async (callback) => {
- const client = await (0, exports.getPool)().connect();
- try {
- await client.query('BEGIN');
- logger_1.logger.debug('Database transaction started');
- const result = await logger_1.performanceLogger.trackAsyncOperation(() => callback(client), 'database-transaction');
- await client.query('COMMIT');
- logger_1.logger.debug('Database transaction committed');
- return result;
- }
- catch (error) {
- await client.query('ROLLBACK');
- logger_1.logger.error({ error }, 'Database transaction rolled back');
- throw new errors_1.DatabaseError(`Transaction failed: ${error instanceof Error ? error.message : 'Unknown error'}`, { originalError: error });
- }
- finally {
- client.release();
- }
-};
-exports.transaction = transaction;
-/**
- * Check database health and connection status
- */
-const healthCheck = async () => {
- try {
- const startTime = Date.now();
- if (!pool) {
- return {
- status: 'unhealthy',
- details: {
- connected: false,
- poolStats: { total: 0, idle: 0, waiting: 0 },
- error: 'Pool not initialized',
- },
- };
- }
- // Test with a simple query
- await pool.query('SELECT 1 as health_check');
- const queryTime = Date.now() - startTime;
- return {
- status: 'healthy',
- details: {
- connected: true,
- poolStats: {
- total: pool.totalCount,
- idle: pool.idleCount,
- waiting: pool.waitingCount,
- },
- queryTime,
- },
- };
- }
- catch (error) {
- return {
- status: 'unhealthy',
- details: {
- connected: false,
- poolStats: {
- total: pool?.totalCount || 0,
- idle: pool?.idleCount || 0,
- waiting: pool?.waitingCount || 0,
- },
- error: error instanceof Error ? error.message : 'Unknown error',
- },
- };
- }
-};
-exports.healthCheck = healthCheck;
-/**
- * Gracefully close the database connection pool
- */
-const closeDatabase = async () => {
- if (pool) {
- logger_1.logger.info('Closing database connection pool...');
- await pool.end();
- pool = null;
- logger_1.logger.info('Database connection pool closed');
- }
-};
-exports.closeDatabase = closeDatabase;
-/**
- * Get current pool statistics for monitoring
- */
-const getPoolStats = () => {
- if (!pool) {
- return {
- total: 0,
- idle: 0,
- waiting: 0,
- connected: false,
- };
- }
- return {
- total: pool.totalCount,
- idle: pool.idleCount,
- waiting: pool.waitingCount,
- connected: true,
- };
-};
-exports.getPoolStats = getPoolStats;
-// Performance monitoring utilities
-exports.databaseMetrics = {
- /**
- * Log slow queries for optimization
- */
- logSlowQuery: (queryText, duration, params) => {
- if (duration > 1000) {
- // Log queries taking more than 1 second
- logger_1.logger.warn({
- query: queryText,
- duration,
- params,
- threshold: '1000ms',
- }, 'Slow query detected');
- }
- },
- /**
- * Monitor connection pool health
- */
- monitorPoolHealth: () => {
- if (!pool)
- return;
- const stats = (0, exports.getPoolStats)();
- const utilizationRate = (stats.total - stats.idle) / stats.total;
- if (utilizationRate > 0.8) {
- logger_1.logger.warn({
- stats,
- utilizationRate,
- }, 'High database connection pool utilization');
- }
- if (stats.waiting > 0) {
- logger_1.logger.warn({
- stats,
- }, 'Clients waiting for database connections');
- }
- },
-};
-//# sourceMappingURL=database.js.map
\ No newline at end of file
diff --git a/backend/dist/config/database.js.map b/backend/dist/config/database.js.map
deleted file mode 100644
index 91af2f0..0000000
--- a/backend/dist/config/database.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"database.js","sourceRoot":"","sources":["../../src/config/database.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/config/index.d.ts b/backend/dist/config/index.d.ts
deleted file mode 100644
index 0c1dfb0..0000000
--- a/backend/dist/config/index.d.ts
+++ /dev/null
@@ -1,82 +0,0 @@
-export declare const config: {
- readonly app: {
- readonly env: "development" | "test" | "production";
- readonly port: number;
- readonly host: string;
- readonly isDevelopment: boolean;
- readonly isProduction: boolean;
- readonly isTest: boolean;
- };
- readonly database: {
- readonly url: string;
- readonly pool: {
- readonly min: number;
- readonly max: number;
- };
- readonly options: {
- readonly parseInputDatesAsUTC: true;
- readonly ssl: boolean;
- };
- };
- readonly redis: {
- readonly host: string;
- readonly port: number;
- readonly password: string | undefined;
- readonly db: number;
- readonly pubSubDb: number;
- readonly options: {
- readonly retryDelayOnFailover: 100;
- readonly enableReadyCheck: false;
- readonly maxRetriesPerRequest: null;
- readonly lazyConnect: true;
- };
- };
- readonly jwt: {
- readonly secret: string;
- readonly refreshSecret: string;
- readonly expiresIn: string;
- readonly refreshExpiresIn: string;
- };
- readonly api: {
- readonly prefix: string;
- readonly version: string;
- readonly cors: {
- readonly origin: string[];
- readonly credentials: true;
- };
- readonly rateLimit: {
- readonly max: number;
- readonly timeWindow: "15 minutes";
- };
- };
- readonly security: {
- readonly bcryptRounds: number;
- readonly maxLoginAttempts: number;
- readonly lockoutDuration: string;
- };
- readonly performance: {
- readonly cache: {
- readonly ttl: {
- readonly short: string;
- readonly medium: string;
- readonly long: string;
- };
- };
- readonly timeouts: {
- readonly query: string;
- readonly request: string;
- };
- };
- readonly logging: {
- readonly level: "error" | "warn" | "info" | "debug";
- readonly format: "json" | "pretty";
- };
- readonly development: {
- readonly seedDatabase: boolean;
- readonly debugSql: boolean;
- readonly debugWebSocket: boolean;
- };
-};
-export type Config = typeof config;
-export type AppEnv = typeof config.app.env;
-//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/config/index.d.ts.map b/backend/dist/config/index.d.ts.map
deleted file mode 100644
index dc8abf8..0000000
--- a/backend/dist/config/index.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"AAiEA,eAAO,MAAM,MAAM;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CA+FT,CAAC;AAGX,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC;AACnC,MAAM,MAAM,MAAM,GAAG,OAAO,MAAM,CAAC,GAAG,CAAC,GAAG,CAAC"}
\ No newline at end of file
diff --git a/backend/dist/config/index.js b/backend/dist/config/index.js
deleted file mode 100644
index 22c219b..0000000
--- a/backend/dist/config/index.js
+++ /dev/null
@@ -1,144 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.config = void 0;
-const dotenv_1 = require("dotenv");
-const zod_1 = require("zod");
-// Load environment variables
-(0, dotenv_1.config)();
-// Environment validation schema
-const envSchema = zod_1.z.object({
- // Application
- NODE_ENV: zod_1.z.enum(['development', 'test', 'production']).default('development'),
- PORT: zod_1.z.union([zod_1.z.string().transform(Number), zod_1.z.number()]).default(3000),
- HOST: zod_1.z.string().default('0.0.0.0'),
- // Database
- DATABASE_URL: zod_1.z.string(),
- DB_POOL_MIN: zod_1.z.string().transform(Number).default('2'),
- DB_POOL_MAX: zod_1.z.string().transform(Number).default('20'),
- // Redis
- REDIS_URL: zod_1.z.string().default('redis://localhost:6379'),
- // JWT
- JWT_SECRET: zod_1.z.string().min(32),
- JWT_REFRESH_SECRET: zod_1.z.string().min(32),
- JWT_EXPIRES_IN: zod_1.z.string().default('15m'),
- JWT_REFRESH_EXPIRES_IN: zod_1.z.string().default('7d'),
- // API
- API_PREFIX: zod_1.z.string().default('/api'),
- API_VERSION: zod_1.z.string().default('v1'),
- CORS_ORIGIN: zod_1.z.string().default('*'),
- RATE_LIMIT_MAX: zod_1.z.string().transform(Number).default('100'),
- // Security
- BCRYPT_ROUNDS: zod_1.z.string().transform(Number).default('12'),
- MAX_LOGIN_ATTEMPTS: zod_1.z.string().transform(Number).default('5'),
- LOCKOUT_DURATION: zod_1.z.string().default('15m'),
- // Redis
- REDIS_HOST: zod_1.z.string().default('localhost'),
- REDIS_PORT: zod_1.z.coerce.number().default(6379),
- REDIS_PASSWORD: zod_1.z.string().optional(),
- REDIS_DB: zod_1.z.coerce.number().default(0),
- REDIS_PUBSUB_DB: zod_1.z.coerce.number().default(1),
- // Performance
- CACHE_TTL_SHORT: zod_1.z.string().default('5m'),
- CACHE_TTL_MEDIUM: zod_1.z.string().default('1h'),
- CACHE_TTL_LONG: zod_1.z.string().default('24h'),
- QUERY_TIMEOUT: zod_1.z.string().default('30s'),
- REQUEST_TIMEOUT: zod_1.z.string().default('30s'),
- // Logging
- LOG_LEVEL: zod_1.z.enum(['error', 'warn', 'info', 'debug']).default('info'),
- LOG_FORMAT: zod_1.z.enum(['json', 'pretty']).default('json'),
- // Development
- SEED_DATABASE: zod_1.z.string().transform(Boolean).default('false'),
- DEBUG_SQL: zod_1.z.string().transform(Boolean).default('false'),
- DEBUG_WEBSOCKET: zod_1.z.string().transform(Boolean).default('false'),
-});
-// Validate and export configuration
-const env = envSchema.parse(process.env);
-exports.config = {
- // Application settings
- app: {
- env: env.NODE_ENV,
- port: env.PORT,
- host: env.HOST,
- isDevelopment: env.NODE_ENV === 'development',
- isProduction: env.NODE_ENV === 'production',
- isTest: env.NODE_ENV === 'test',
- },
- // Database configuration
- database: {
- url: env.DATABASE_URL,
- pool: {
- min: env.DB_POOL_MIN,
- max: env.DB_POOL_MAX,
- },
- options: {
- parseInputDatesAsUTC: true,
- ssl: env.NODE_ENV === 'production',
- },
- },
- // Redis configuration
- redis: {
- host: env.REDIS_HOST,
- port: env.REDIS_PORT,
- password: env.REDIS_PASSWORD,
- db: env.REDIS_DB,
- pubSubDb: env.REDIS_PUBSUB_DB,
- options: {
- retryDelayOnFailover: 100,
- enableReadyCheck: false,
- maxRetriesPerRequest: null,
- lazyConnect: true,
- },
- },
- // JWT configuration
- jwt: {
- secret: env.JWT_SECRET,
- refreshSecret: env.JWT_REFRESH_SECRET,
- expiresIn: env.JWT_EXPIRES_IN,
- refreshExpiresIn: env.JWT_REFRESH_EXPIRES_IN,
- },
- // API configuration
- api: {
- prefix: env.API_PREFIX,
- version: env.API_VERSION,
- cors: {
- origin: env.CORS_ORIGIN.split(','),
- credentials: true,
- },
- rateLimit: {
- max: env.RATE_LIMIT_MAX,
- timeWindow: '15 minutes',
- },
- },
- // Security configuration
- security: {
- bcryptRounds: env.BCRYPT_ROUNDS,
- maxLoginAttempts: env.MAX_LOGIN_ATTEMPTS,
- lockoutDuration: env.LOCKOUT_DURATION,
- },
- // Performance configuration
- performance: {
- cache: {
- ttl: {
- short: env.CACHE_TTL_SHORT,
- medium: env.CACHE_TTL_MEDIUM,
- long: env.CACHE_TTL_LONG,
- },
- },
- timeouts: {
- query: env.QUERY_TIMEOUT,
- request: env.REQUEST_TIMEOUT,
- },
- },
- // Logging configuration
- logging: {
- level: env.LOG_LEVEL,
- format: env.LOG_FORMAT,
- },
- // Development configuration
- development: {
- seedDatabase: env.SEED_DATABASE,
- debugSql: env.DEBUG_SQL,
- debugWebSocket: env.DEBUG_WEBSOCKET,
- },
-};
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/backend/dist/config/index.js.map b/backend/dist/config/index.js.map
deleted file mode 100644
index 9a2c95e..0000000
--- a/backend/dist/config/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/config/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/config/redis.d.ts b/backend/dist/config/redis.d.ts
deleted file mode 100644
index e95093b..0000000
--- a/backend/dist/config/redis.d.ts
+++ /dev/null
@@ -1,86 +0,0 @@
-import Redis from 'ioredis';
-/**
- * Redis configuration and connection management
- * Enterprise-grade caching with performance monitoring
- */
-export interface CacheMetrics {
- hits: number;
- misses: number;
- sets: number;
- deletes: number;
- errors: number;
- totalOperations: number;
- hitRate: number;
-}
-declare class RedisManager {
- private client;
- private subscriber;
- private publisher;
- private isConnected;
- private reconnectAttempts;
- private maxReconnectAttempts;
- private metrics;
- /**
- * Initialize Redis connections
- */
- initialize(): Promise;
- /**
- * Setup Redis event handlers
- */
- private setupEventHandlers;
- /**
- * Get the main Redis client
- */
- getClient(): Redis;
- /**
- * Get the subscriber client
- */
- getSubscriber(): Redis;
- /**
- * Get the publisher client
- */
- getPublisher(): Redis;
- /**
- * Check if Redis is connected
- */
- isRedisConnected(): boolean;
- /**
- * Health check for Redis
- */
- healthCheck(): Promise;
- /**
- * Get cache metrics
- */
- getMetrics(): CacheMetrics;
- /**
- * Reset metrics
- */
- resetMetrics(): void;
- /**
- * Start metrics collection
- */
- private startMetricsCollection;
- /**
- * Increment hit counter
- */
- incrementHits(): void;
- /**
- * Increment miss counter
- */
- incrementMisses(): void;
- /**
- * Increment sets counter
- */
- incrementSets(): void;
- /**
- * Increment deletes counter
- */
- incrementDeletes(): void;
- /**
- * Close all Redis connections
- */
- close(): Promise;
-}
-export declare const redisManager: RedisManager;
-export default redisManager;
-//# sourceMappingURL=redis.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/config/redis.d.ts.map b/backend/dist/config/redis.d.ts.map
deleted file mode 100644
index f00ec25..0000000
--- a/backend/dist/config/redis.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"redis.d.ts","sourceRoot":"","sources":["../../src/config/redis.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,SAAS,CAAC;AAK5B;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;IAChB,MAAM,EAAE,MAAM,CAAC;IACf,eAAe,EAAE,MAAM,CAAC;IACxB,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,cAAM,YAAY;IAChB,OAAO,CAAC,MAAM,CAAsB;IACpC,OAAO,CAAC,UAAU,CAAsB;IACxC,OAAO,CAAC,SAAS,CAAsB;IACvC,OAAO,CAAC,WAAW,CAAS;IAC5B,OAAO,CAAC,iBAAiB,CAAK;IAC9B,OAAO,CAAC,oBAAoB,CAAK;IACjC,OAAO,CAAC,OAAO,CAQb;IAEF;;OAEG;IACG,UAAU,IAAI,OAAO,CAAC,IAAI,CAAC;IAwDjC;;OAEG;IACH,OAAO,CAAC,kBAAkB;IA4C1B;;OAEG;IACH,SAAS,IAAI,KAAK;IAOlB;;OAEG;IACH,aAAa,IAAI,KAAK;IAOtB;;OAEG;IACH,YAAY,IAAI,KAAK;IAOrB;;OAEG;IACH,gBAAgB,IAAI,OAAO;IAI3B;;OAEG;IACG,WAAW,IAAI,OAAO,CAAC,OAAO,CAAC;IAYrC;;OAEG;IACH,UAAU,IAAI,YAAY;IAS1B;;OAEG;IACH,YAAY,IAAI,IAAI;IAYpB;;OAEG;IACH,OAAO,CAAC,sBAAsB;IA2B9B;;OAEG;IACH,aAAa,IAAI,IAAI;IAIrB;;OAEG;IACH,eAAe,IAAI,IAAI;IAIvB;;OAEG;IACH,aAAa,IAAI,IAAI;IAIrB;;OAEG;IACH,gBAAgB,IAAI,IAAI;IAIxB;;OAEG;IACG,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAoB7B;AAGD,eAAO,MAAM,YAAY,cAAqB,CAAC;AAC/C,eAAe,YAAY,CAAC"}
\ No newline at end of file
diff --git a/backend/dist/config/redis.js b/backend/dist/config/redis.js
deleted file mode 100644
index 9ab0e15..0000000
--- a/backend/dist/config/redis.js
+++ /dev/null
@@ -1,259 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.redisManager = void 0;
-const ioredis_1 = __importDefault(require("ioredis"));
-const index_1 = require("./index");
-const logger_1 = require("@utils/logger");
-const errors_1 = require("@utils/errors");
-class RedisManager {
- client = null;
- subscriber = null;
- publisher = null;
- isConnected = false;
- reconnectAttempts = 0;
- maxReconnectAttempts = 5;
- metrics = {
- hits: 0,
- misses: 0,
- sets: 0,
- deletes: 0,
- errors: 0,
- totalOperations: 0,
- hitRate: 0,
- };
- /**
- * Initialize Redis connections
- */
- async initialize() {
- try {
- logger_1.logger.info('Initializing Redis connections...');
- const redisOptions = {
- host: index_1.config.redis?.host || 'localhost',
- port: index_1.config.redis?.port || 6379,
- db: index_1.config.redis?.db || 0,
- retryDelayOnFailover: 100,
- maxRetriesPerRequest: 3,
- connectTimeout: 5000,
- lazyConnect: true,
- keepAlive: 30000,
- };
- if (typeof index_1.config.redis?.password === 'string') {
- redisOptions.password = index_1.config.redis.password;
- }
- // Main client for general operations
- this.client = new ioredis_1.default(redisOptions);
- // Subscriber for pub/sub operations
- this.subscriber = new ioredis_1.default({
- ...redisOptions,
- db: index_1.config.redis?.pubSubDb || 1,
- });
- // Publisher for pub/sub operations
- this.publisher = new ioredis_1.default({
- ...redisOptions,
- db: index_1.config.redis?.pubSubDb || 1,
- });
- // Setup event handlers
- this.setupEventHandlers();
- // Connect all clients
- await Promise.all([
- this.client.connect(),
- this.subscriber.connect(),
- this.publisher.connect(),
- ]);
- this.isConnected = true;
- this.reconnectAttempts = 0;
- logger_1.logger.info('Redis initialized');
- // Start metrics collection
- this.startMetricsCollection();
- }
- catch (error) {
- logger_1.logger.error({ error }, 'Failed to initialize Redis connections');
- throw new errors_1.CacheError('Redis initialization failed', { error });
- }
- }
- /**
- * Setup Redis event handlers
- */
- setupEventHandlers() {
- if (!this.client)
- return;
- this.client.on('connect', () => {
- logger_1.loggers.cache.info('Redis client connected');
- this.isConnected = true;
- this.reconnectAttempts = 0;
- });
- this.client.on('ready', () => {
- logger_1.loggers.cache.info('Redis client ready for operations');
- });
- this.client.on('error', (error) => {
- logger_1.loggers.cache.error({ error }, 'Redis client error');
- this.metrics.errors++;
- this.isConnected = false;
- });
- this.client.on('close', () => {
- logger_1.loggers.cache.warn('Redis client connection closed');
- this.isConnected = false;
- });
- this.client.on('reconnecting', () => {
- this.reconnectAttempts++;
- logger_1.loggers.cache.warn({ attempt: this.reconnectAttempts }, 'Redis client reconnecting');
- if (this.reconnectAttempts >= this.maxReconnectAttempts) {
- logger_1.loggers.cache.error('Max reconnection attempts reached');
- this.client?.disconnect();
- }
- });
- // Setup similar handlers for subscriber and publisher
- this.subscriber?.on('error', (error) => {
- logger_1.loggers.cache.error({ error, type: 'subscriber' }, 'Redis subscriber error');
- });
- this.publisher?.on('error', (error) => {
- logger_1.loggers.cache.error({ error, type: 'publisher' }, 'Redis publisher error');
- });
- }
- /**
- * Get the main Redis client
- */
- getClient() {
- if (!this.client) {
- throw new errors_1.CacheError('Redis client not initialized');
- }
- return this.client;
- }
- /**
- * Get the subscriber client
- */
- getSubscriber() {
- if (!this.subscriber) {
- throw new errors_1.CacheError('Redis subscriber not initialized');
- }
- return this.subscriber;
- }
- /**
- * Get the publisher client
- */
- getPublisher() {
- if (!this.publisher) {
- throw new errors_1.CacheError('Redis publisher not initialized');
- }
- return this.publisher;
- }
- /**
- * Check if Redis is connected
- */
- isRedisConnected() {
- return this.isConnected && this.client?.status === 'ready';
- }
- /**
- * Health check for Redis
- */
- async healthCheck() {
- try {
- if (!this.client)
- return false;
- const result = await this.client.ping();
- return result === 'PONG';
- }
- catch (error) {
- logger_1.loggers.cache.error({ error }, 'Redis health check failed');
- return false;
- }
- }
- /**
- * Get cache metrics
- */
- getMetrics() {
- const totalOperations = this.metrics.hits + this.metrics.misses;
- return {
- ...this.metrics,
- totalOperations,
- hitRate: totalOperations > 0 ? (this.metrics.hits / totalOperations) * 100 : 0,
- };
- }
- /**
- * Reset metrics
- */
- resetMetrics() {
- this.metrics = {
- hits: 0,
- misses: 0,
- sets: 0,
- deletes: 0,
- errors: 0,
- totalOperations: 0,
- hitRate: 0,
- };
- }
- /**
- * Start metrics collection
- */
- startMetricsCollection() {
- // Log metrics every 5 minutes
- setInterval(() => {
- const metrics = this.getMetrics();
- logger_1.loggers.cache.info({
- metrics,
- isConnected: this.isConnected,
- status: this.client?.status,
- }, 'Redis cache metrics');
- // Log warnings for poor performance
- if (metrics.hitRate < 80 && metrics.totalOperations > 100) {
- logger_1.loggers.cache.warn({ hitRate: metrics.hitRate }, 'Low cache hit rate detected');
- }
- if (metrics.errors > 10) {
- logger_1.loggers.cache.warn({ errors: metrics.errors }, 'High error rate in Redis operations');
- }
- }, 5 * 60 * 1000);
- }
- /**
- * Increment hit counter
- */
- incrementHits() {
- this.metrics.hits++;
- }
- /**
- * Increment miss counter
- */
- incrementMisses() {
- this.metrics.misses++;
- }
- /**
- * Increment sets counter
- */
- incrementSets() {
- this.metrics.sets++;
- }
- /**
- * Increment deletes counter
- */
- incrementDeletes() {
- this.metrics.deletes++;
- }
- /**
- * Close all Redis connections
- */
- async close() {
- try {
- logger_1.logger.info('Closing Redis connections...');
- await Promise.allSettled([
- this.client?.quit(),
- this.subscriber?.quit(),
- this.publisher?.quit(),
- ]);
- this.client = null;
- this.subscriber = null;
- this.publisher = null;
- this.isConnected = false;
- logger_1.logger.info('Redis connections closed successfully');
- }
- catch (error) {
- logger_1.logger.error({ error }, 'Error closing Redis connections');
- }
- }
-}
-// Export singleton instance
-exports.redisManager = new RedisManager();
-exports.default = exports.redisManager;
-//# sourceMappingURL=redis.js.map
\ No newline at end of file
diff --git a/backend/dist/config/redis.js.map b/backend/dist/config/redis.js.map
deleted file mode 100644
index 9278eea..0000000
--- a/backend/dist/config/redis.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"redis.js","sourceRoot":"","sources":["../../src/config/redis.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/db/ActivityRepository.d.ts b/backend/dist/db/ActivityRepository.d.ts
deleted file mode 100644
index 380a3d2..0000000
--- a/backend/dist/db/ActivityRepository.d.ts
+++ /dev/null
@@ -1,135 +0,0 @@
-import { DatabaseClient } from '../config/database';
-import BaseRepository, { BaseEntity } from './BaseRepository';
-export interface Activity extends BaseEntity {
- channel_id?: string;
- task_id?: string;
- user_id: string;
- activity_type: 'message' | 'task_created' | 'task_updated' | 'task_completed' | 'task_assigned' | 'member_joined' | 'member_left' | 'file_uploaded' | 'channel_updated' | 'channel_created' | 'reaction_added' | 'mention' | 'voice_command' | 'ai_response';
- title: string;
- description?: string;
- metadata: Record;
- read_by: string[];
- priority: 'low' | 'medium' | 'high';
- category: 'task' | 'channel' | 'system' | 'social';
- referenced_entity_id?: string;
- referenced_entity_type?: 'task' | 'message' | 'channel' | 'user' | 'file';
-}
-export interface CreateActivityData {
- channelId?: string;
- taskId?: string;
- userId: string;
- activityType: Activity['activity_type'];
- title: string;
- description?: string;
- metadata?: Record;
- priority?: Activity['priority'];
- category?: Activity['category'];
- referencedEntityId?: string;
- referencedEntityType?: Activity['referenced_entity_type'];
-}
-export interface ActivityWithUser extends Activity {
- user_name: string;
- user_email: string;
- user_avatar?: string;
- user_role: string;
- channel_name?: string;
- task_title?: string;
-}
-declare class ActivityRepository extends BaseRepository {
- constructor();
- /**
- * Create new activity with validation
- */
- findMany(filters: {
- type?: string[];
- channel_id?: string;
- user_id?: string;
- from_date?: string;
- to_date?: string;
- limit?: number;
- offset?: number;
- includeUser?: boolean;
- }): Promise;
- count(filters: any): Promise;
- getUserFeed(userId: string, limit: number, offset: number): Promise;
- getUserFeedCount(userId: string): Promise;
- getActivityStats(options: {
- userId?: string;
- period?: string;
- channelId?: string;
- }): Promise;
- createActivity(activityData: CreateActivityData, client?: DatabaseClient): Promise;
- /**
- * Find activities for a specific user
- */
- findUserActivities(userId: string, filters?: {
- activityType?: string;
- category?: string;
- unreadOnly?: boolean;
- channelId?: string;
- taskId?: string;
- after?: Date;
- before?: Date;
- }, limit?: number, offset?: number, client?: DatabaseClient): Promise;
- /**
- * Find activities for a channel
- */
- findChannelActivities(channelId: string, filters?: {
- activityType?: string;
- userId?: string;
- after?: Date;
- before?: Date;
- }, limit?: number, offset?: number, client?: DatabaseClient): Promise;
- /**
- * Get channel activity count
- */
- getChannelActivityCount(channelId: string, filters?: {
- activityType?: string;
- userId?: string;
- after?: Date;
- before?: Date;
- }, client?: DatabaseClient): Promise;
- /**
- * Get user activity count
- */
- getUserActivityCount(userId: string, unreadOnly?: boolean, client?: DatabaseClient): Promise;
- /**
- * Mark activity as read by user
- */
- markAsRead(activityId: string, userId: string, client?: DatabaseClient): Promise;
- /**
- * Mark multiple activities as read
- */
- markMultipleAsRead(activityIds: string[], userId: string, client?: DatabaseClient): Promise;
- /**
- * Mark all user activities as read
- */
- markAllAsRead(userId: string, client?: DatabaseClient): Promise;
- /**
- * Get activity statistics for a user
- */
- getUserActivityStats(userId: string, daysSince?: number, client?: DatabaseClient): Promise<{
- totalActivities: number;
- unreadActivities: number;
- activitiesByType: Record;
- activitiesByCategory: Record;
- recentActivity: Array<{
- date: string;
- count: number;
- }>;
- }>;
- /**
- * Determine priority based on activity type
- */
- private determinePriority;
- /**
- * Determine category based on activity type
- */
- private determineCategory;
- /**
- * Clean up old activities
- */
- cleanupOldActivities(daysToKeep?: number, client?: DatabaseClient): Promise;
-}
-export default ActivityRepository;
-//# sourceMappingURL=ActivityRepository.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/db/ActivityRepository.d.ts.map b/backend/dist/db/ActivityRepository.d.ts.map
deleted file mode 100644
index 80a1e50..0000000
--- a/backend/dist/db/ActivityRepository.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ActivityRepository.d.ts","sourceRoot":"","sources":["../../src/db/ActivityRepository.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/db/ActivityRepository.js b/backend/dist/db/ActivityRepository.js
deleted file mode 100644
index b48ed5d..0000000
--- a/backend/dist/db/ActivityRepository.js
+++ /dev/null
@@ -1,620 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const logger_1 = require("../utils/logger");
-const BaseRepository_1 = __importDefault(require("./BaseRepository"));
-class ActivityRepository extends BaseRepository_1.default {
- constructor() {
- super('activities');
- }
- /**
- * Create new activity with validation
- */
- // Add methods needed for the API routes
- async findMany(filters) {
- let whereConditions = ['a.deleted_at IS NULL'];
- let params = [];
- let paramIndex = 1;
- if (filters.type) {
- whereConditions.push(`a.activity_type = ANY($${paramIndex})`);
- params.push(filters.type);
- paramIndex++;
- }
- if (filters.channel_id) {
- whereConditions.push(`a.channel_id = $${paramIndex}`);
- params.push(filters.channel_id);
- paramIndex++;
- }
- if (filters.user_id) {
- whereConditions.push(`a.user_id = $${paramIndex}`);
- params.push(filters.user_id);
- paramIndex++;
- }
- if (filters.from_date) {
- whereConditions.push(`a.created_at >= $${paramIndex}`);
- params.push(filters.from_date);
- paramIndex++;
- }
- if (filters.to_date) {
- whereConditions.push(`a.created_at <= $${paramIndex}`);
- params.push(filters.to_date);
- paramIndex++;
- }
- const userJoin = filters.includeUser ? `
- LEFT JOIN users u ON a.user_id = u.id AND u.deleted_at IS NULL
- ` : '';
- const userFields = filters.includeUser ? `
- u.name as user_name,
- u.email as user_email,
- u.avatar_url,
- u.role as user_role
- ` : '';
- const sql = `
- SELECT
- a.*,
- ${userFields}
- FROM ${this.tableName} a
- ${userJoin}
- WHERE ${whereConditions.join(' AND ')}
- ORDER BY a.created_at DESC
- ${filters.limit ? `LIMIT $${paramIndex}` : ''}
- ${filters.offset && filters.limit ? `OFFSET $${paramIndex + 1}` : ''}
- `;
- if (filters.limit) {
- params.push(filters.limit);
- if (filters.offset) {
- params.push(filters.offset);
- }
- }
- const result = await this.executeRawQuery(sql, params);
- return result.rows.map(row => ({
- ...row,
- user: filters.includeUser && row.user_name ? {
- id: row.user_id,
- name: row.user_name,
- email: row.user_email,
- avatar_url: row.avatar_url,
- } : undefined
- }));
- }
- async count(filters) {
- let whereConditions = ['deleted_at IS NULL'];
- let params = [];
- let paramIndex = 1;
- if (filters.type) {
- whereConditions.push(`activity_type = ANY($${paramIndex})`);
- params.push(filters.type);
- paramIndex++;
- }
- if (filters.channel_id) {
- whereConditions.push(`channel_id = $${paramIndex}`);
- params.push(filters.channel_id);
- paramIndex++;
- }
- if (filters.user_id) {
- whereConditions.push(`user_id = $${paramIndex}`);
- params.push(filters.user_id);
- paramIndex++;
- }
- const sql = `
- SELECT COUNT(*) as count
- FROM ${this.tableName}
- WHERE ${whereConditions.join(' AND ')}
- `;
- const result = await this.executeRawQuery(sql, params);
- return parseInt(result.rows[0]?.count || '0', 10);
- }
- async getUserFeed(userId, limit, offset) {
- return this.findMany({
- limit,
- offset,
- includeUser: true,
- });
- }
- async getUserFeedCount(userId) {
- return this.count({});
- }
- async getActivityStats(options) {
- return {
- totalActivities: 0,
- activitiesByType: {},
- activitiesByPeriod: {},
- };
- }
- async createActivity(activityData, client) {
- // Set defaults
- const activityToCreate = {
- channel_id: activityData.channelId,
- task_id: activityData.taskId,
- user_id: activityData.userId,
- activity_type: activityData.activityType,
- title: activityData.title,
- description: activityData.description || '',
- metadata: activityData.metadata || {},
- read_by: [],
- priority: activityData.priority || this.determinePriority(activityData.activityType),
- category: activityData.category || this.determineCategory(activityData.activityType),
- referenced_entity_id: activityData.referencedEntityId,
- referenced_entity_type: activityData.referencedEntityType,
- };
- const activity = await this.create(activityToCreate, client);
- logger_1.logger.info({
- activityId: activity.id,
- activityType: activity.activity_type,
- userId: activity.user_id,
- channelId: activity.channel_id,
- taskId: activity.task_id,
- }, 'Activity created successfully');
- return activity;
- }
- /**
- * Find activities for a specific user
- */
- async findUserActivities(userId, filters, limit = 50, offset = 0, client) {
- let whereConditions = ['a.deleted_at IS NULL'];
- let params = [];
- let paramIndex = 1;
- // User should see activities where:
- // 1. They are the actor (created the activity)
- // 2. They are mentioned/assigned in tasks
- // 3. Activities in channels they are members of
- // 4. Activities on tasks they are assigned to
- whereConditions.push(`(
- a.user_id = $${paramIndex}
- OR a.metadata::text LIKE '%"' || $${paramIndex} || '"%'
- OR EXISTS (
- SELECT 1 FROM channels c
- WHERE c.id = a.channel_id
- AND $${paramIndex} = ANY(c.members)
- AND c.deleted_at IS NULL
- )
- OR EXISTS (
- SELECT 1 FROM tasks t
- WHERE t.id = a.task_id
- AND $${paramIndex} = ANY(t.assigned_to)
- AND t.deleted_at IS NULL
- )
- )`);
- params.push(userId);
- paramIndex++;
- // Add filters
- if (filters?.activityType) {
- whereConditions.push(`a.activity_type = $${paramIndex}`);
- params.push(filters.activityType);
- paramIndex++;
- }
- if (filters?.category) {
- whereConditions.push(`a.category = $${paramIndex}`);
- params.push(filters.category);
- paramIndex++;
- }
- if (filters?.channelId) {
- whereConditions.push(`a.channel_id = $${paramIndex}`);
- params.push(filters.channelId);
- paramIndex++;
- }
- if (filters?.taskId) {
- whereConditions.push(`a.task_id = $${paramIndex}`);
- params.push(filters.taskId);
- paramIndex++;
- }
- if (filters?.unreadOnly) {
- whereConditions.push(`NOT ($${paramIndex - params.length + 1} = ANY(a.read_by))`);
- }
- if (filters?.after) {
- whereConditions.push(`a.created_at > $${paramIndex}`);
- params.push(filters.after);
- paramIndex++;
- }
- if (filters?.before) {
- whereConditions.push(`a.created_at < $${paramIndex}`);
- params.push(filters.before);
- paramIndex++;
- }
- const sql = `
- SELECT
- a.*,
- u.name as user_name,
- u.email as user_email,
- u.avatar_url as user_avatar,
- u.role as user_role,
- c.name as channel_name,
- t.title as task_title
- FROM ${this.tableName} a
- LEFT JOIN users u ON a.user_id = u.id
- LEFT JOIN channels c ON a.channel_id = c.id
- LEFT JOIN tasks t ON a.task_id = t.id
- WHERE ${whereConditions.join(' AND ')}
- ORDER BY a.created_at DESC
- LIMIT $${paramIndex} OFFSET $${paramIndex + 1}
- `;
- params.push(limit, offset);
- const result = await this.executeRawQuery(sql, params, client);
- return result.rows;
- }
- /**
- * Find activities for a channel
- */
- async findChannelActivities(channelId, filters, limit = 50, offset = 0, client) {
- let whereConditions = ['a.channel_id = $1', 'a.deleted_at IS NULL'];
- let params = [channelId];
- let paramIndex = 2;
- // Add filters
- if (filters?.activityType) {
- whereConditions.push(`a.activity_type = $${paramIndex}`);
- params.push(filters.activityType);
- paramIndex++;
- }
- if (filters?.userId) {
- whereConditions.push(`a.user_id = $${paramIndex}`);
- params.push(filters.userId);
- paramIndex++;
- }
- if (filters?.after) {
- whereConditions.push(`a.created_at > $${paramIndex}`);
- params.push(filters.after);
- paramIndex++;
- }
- if (filters?.before) {
- whereConditions.push(`a.created_at < $${paramIndex}`);
- params.push(filters.before);
- paramIndex++;
- }
- const sql = `
- SELECT
- a.*,
- u.name as user_name,
- u.email as user_email,
- u.avatar_url as user_avatar,
- u.role as user_role,
- c.name as channel_name,
- t.title as task_title
- FROM ${this.tableName} a
- LEFT JOIN users u ON a.user_id = u.id
- LEFT JOIN channels c ON a.channel_id = c.id
- LEFT JOIN tasks t ON a.task_id = t.id
- WHERE ${whereConditions.join(' AND ')}
- ORDER BY a.created_at DESC
- LIMIT $${paramIndex} OFFSET $${paramIndex + 1}
- `;
- params.push(limit, offset);
- const result = await this.executeRawQuery(sql, params, client);
- return result.rows;
- }
- /**
- * Get channel activity count
- */
- async getChannelActivityCount(channelId, filters, client) {
- let whereConditions = ['channel_id = $1', 'deleted_at IS NULL'];
- let params = [channelId];
- let paramIndex = 2;
- // Add filters
- if (filters?.activityType) {
- whereConditions.push(`activity_type = $${paramIndex}`);
- params.push(filters.activityType);
- paramIndex++;
- }
- if (filters?.userId) {
- whereConditions.push(`user_id = $${paramIndex}`);
- params.push(filters.userId);
- paramIndex++;
- }
- if (filters?.after) {
- whereConditions.push(`created_at > $${paramIndex}`);
- params.push(filters.after);
- paramIndex++;
- }
- if (filters?.before) {
- whereConditions.push(`created_at < $${paramIndex}`);
- params.push(filters.before);
- paramIndex++;
- }
- const sql = `
- SELECT COUNT(*) as count
- FROM ${this.tableName}
- WHERE ${whereConditions.join(' AND ')}
- `;
- const result = await this.executeRawQuery(sql, params, client);
- return parseInt(result.rows[0]?.count || '0', 10);
- }
- /**
- * Get user activity count
- */
- async getUserActivityCount(userId, unreadOnly = false, client) {
- let whereConditions = ['deleted_at IS NULL'];
- let params = [];
- let paramIndex = 1;
- // User should see activities where they are involved
- whereConditions.push(`(
- user_id = $${paramIndex}
- OR metadata::text LIKE '%"' || $${paramIndex} || '"%'
- OR EXISTS (
- SELECT 1 FROM channels c
- WHERE c.id = channel_id
- AND $${paramIndex} = ANY(c.members)
- AND c.deleted_at IS NULL
- )
- OR EXISTS (
- SELECT 1 FROM tasks t
- WHERE t.id = task_id
- AND $${paramIndex} = ANY(t.assigned_to)
- AND t.deleted_at IS NULL
- )
- )`);
- params.push(userId);
- paramIndex++;
- if (unreadOnly) {
- whereConditions.push(`NOT ($${paramIndex - 1} = ANY(read_by))`);
- }
- const sql = `
- SELECT COUNT(*) as count
- FROM ${this.tableName}
- WHERE ${whereConditions.join(' AND ')}
- `;
- const result = await this.executeRawQuery(sql, params, client);
- return parseInt(result.rows[0]?.count || '0', 10);
- }
- /**
- * Mark activity as read by user
- */
- async markAsRead(activityId, userId, client) {
- const sql = `
- UPDATE ${this.tableName}
- SET read_by = CASE
- WHEN $2 = ANY(read_by) THEN read_by
- ELSE array_append(read_by, $2)
- END
- WHERE id = $1 AND deleted_at IS NULL
- RETURNING id
- `;
- try {
- const result = await this.executeRawQuery(sql, [activityId, userId], client);
- if (result.rowCount > 0) {
- logger_1.logger.debug({
- activityId,
- userId,
- }, 'Activity marked as read');
- return true;
- }
- return false;
- }
- catch (error) {
- logger_1.logger.error({ error, activityId, userId }, 'Failed to mark activity as read');
- return false;
- }
- }
- /**
- * Mark multiple activities as read
- */
- async markMultipleAsRead(activityIds, userId, client) {
- if (activityIds.length === 0)
- return 0;
- const placeholders = activityIds.map((_, index) => `$${index + 2}`).join(',');
- const sql = `
- UPDATE ${this.tableName}
- SET read_by = CASE
- WHEN $1 = ANY(read_by) THEN read_by
- ELSE array_append(read_by, $1)
- END
- WHERE id = ANY(ARRAY[${placeholders}]) AND deleted_at IS NULL
- `;
- try {
- const result = await this.executeRawQuery(sql, [userId, ...activityIds], client);
- logger_1.logger.info({
- userId,
- markedCount: result.rowCount,
- totalIds: activityIds.length,
- }, 'Multiple activities marked as read');
- return result.rowCount;
- }
- catch (error) {
- logger_1.logger.error({ error, userId, activityIds }, 'Failed to mark multiple activities as read');
- return 0;
- }
- }
- /**
- * Mark all user activities as read
- */
- async markAllAsRead(userId, client) {
- const sql = `
- UPDATE ${this.tableName}
- SET read_by = CASE
- WHEN $1 = ANY(read_by) THEN read_by
- ELSE array_append(read_by, $1)
- END
- WHERE deleted_at IS NULL
- AND NOT ($1 = ANY(read_by))
- AND (
- user_id = $1
- OR metadata::text LIKE '%"' || $1 || '"%'
- OR EXISTS (
- SELECT 1 FROM channels c
- WHERE c.id = channel_id
- AND $1 = ANY(c.members)
- AND c.deleted_at IS NULL
- )
- OR EXISTS (
- SELECT 1 FROM tasks t
- WHERE t.id = task_id
- AND $1 = ANY(t.assigned_to)
- AND t.deleted_at IS NULL
- )
- )
- `;
- try {
- const result = await this.executeRawQuery(sql, [userId], client);
- logger_1.logger.info({
- userId,
- markedCount: result.rowCount,
- }, 'All user activities marked as read');
- return result.rowCount;
- }
- catch (error) {
- logger_1.logger.error({ error, userId }, 'Failed to mark all activities as read');
- return 0;
- }
- }
- /**
- * Get activity statistics for a user
- */
- async getUserActivityStats(userId, daysSince = 30, client) {
- const statsSql = `
- WITH user_activities AS (
- SELECT *
- FROM ${this.tableName}
- WHERE deleted_at IS NULL
- AND created_at >= NOW() - INTERVAL '${daysSince} days'
- AND (
- user_id = $1
- OR metadata::text LIKE '%"' || $1 || '"%'
- OR EXISTS (
- SELECT 1 FROM channels c
- WHERE c.id = channel_id
- AND $1 = ANY(c.members)
- AND c.deleted_at IS NULL
- )
- OR EXISTS (
- SELECT 1 FROM tasks t
- WHERE t.id = task_id
- AND $1 = ANY(t.assigned_to)
- AND t.deleted_at IS NULL
- )
- )
- )
- SELECT
- COUNT(*) as total_activities,
- COUNT(*) FILTER (WHERE NOT ($1 = ANY(read_by))) as unread_activities,
- COUNT(*) FILTER (WHERE activity_type = 'message') as message_activities,
- COUNT(*) FILTER (WHERE activity_type = 'task_created') as task_created_activities,
- COUNT(*) FILTER (WHERE activity_type = 'task_updated') as task_updated_activities,
- COUNT(*) FILTER (WHERE activity_type = 'task_completed') as task_completed_activities,
- COUNT(*) FILTER (WHERE category = 'task') as task_category,
- COUNT(*) FILTER (WHERE category = 'channel') as channel_category,
- COUNT(*) FILTER (WHERE category = 'system') as system_category,
- COUNT(*) FILTER (WHERE category = 'social') as social_category
- FROM user_activities
- `;
- const recentActivitySql = `
- SELECT
- DATE(created_at) as date,
- COUNT(*) as count
- FROM ${this.tableName}
- WHERE deleted_at IS NULL
- AND created_at >= NOW() - INTERVAL '${daysSince} days'
- AND (
- user_id = $1
- OR metadata::text LIKE '%"' || $1 || '"%'
- OR EXISTS (
- SELECT 1 FROM channels c
- WHERE c.id = channel_id
- AND $1 = ANY(c.members)
- AND c.deleted_at IS NULL
- )
- OR EXISTS (
- SELECT 1 FROM tasks t
- WHERE t.id = task_id
- AND $1 = ANY(t.assigned_to)
- AND t.deleted_at IS NULL
- )
- )
- GROUP BY DATE(created_at)
- ORDER BY date DESC
- `;
- const [statsResult, recentActivityResult] = await Promise.all([
- this.executeRawQuery(statsSql, [userId], client),
- this.executeRawQuery(recentActivitySql, [userId], client),
- ]);
- const stats = statsResult.rows[0];
- return {
- totalActivities: parseInt(stats.total_activities, 10),
- unreadActivities: parseInt(stats.unread_activities, 10),
- activitiesByType: {
- message: parseInt(stats.message_activities, 10),
- task_created: parseInt(stats.task_created_activities, 10),
- task_updated: parseInt(stats.task_updated_activities, 10),
- task_completed: parseInt(stats.task_completed_activities, 10),
- },
- activitiesByCategory: {
- task: parseInt(stats.task_category, 10),
- channel: parseInt(stats.channel_category, 10),
- system: parseInt(stats.system_category, 10),
- social: parseInt(stats.social_category, 10),
- },
- recentActivity: recentActivityResult.rows.map((row) => ({
- date: row.date,
- count: parseInt(row.count, 10),
- })),
- };
- }
- /**
- * Determine priority based on activity type
- */
- determinePriority(activityType) {
- switch (activityType) {
- case 'task_created':
- case 'task_assigned':
- return 'medium';
- case 'task_completed':
- return 'low';
- case 'mention':
- return 'high';
- case 'voice_command':
- return 'high';
- default:
- return 'low';
- }
- }
- /**
- * Determine category based on activity type
- */
- determineCategory(activityType) {
- switch (activityType) {
- case 'task_created':
- case 'task_updated':
- case 'task_completed':
- case 'task_assigned':
- return 'task';
- case 'message':
- case 'member_joined':
- case 'member_left':
- case 'channel_updated':
- case 'channel_created':
- return 'channel';
- case 'mention':
- case 'reaction_added':
- return 'social';
- case 'file_uploaded':
- case 'voice_command':
- case 'ai_response':
- return 'system';
- default:
- return 'system';
- }
- }
- /**
- * Clean up old activities
- */
- async cleanupOldActivities(daysToKeep = 90, client) {
- const sql = `
- DELETE FROM ${this.tableName}
- WHERE created_at < NOW() - INTERVAL '${daysToKeep} days'
- AND category != 'task' -- Keep task-related activities longer
- `;
- try {
- const result = await this.executeRawQuery(sql, [], client);
- logger_1.logger.info({
- deletedCount: result.rowCount,
- daysToKeep,
- }, 'Old activities cleaned up');
- return result.rowCount;
- }
- catch (error) {
- logger_1.logger.error({ error, daysToKeep }, 'Failed to clean up old activities');
- return 0;
- }
- }
-}
-exports.default = ActivityRepository;
-//# sourceMappingURL=ActivityRepository.js.map
\ No newline at end of file
diff --git a/backend/dist/db/ActivityRepository.js.map b/backend/dist/db/ActivityRepository.js.map
deleted file mode 100644
index 8fa562e..0000000
--- a/backend/dist/db/ActivityRepository.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ActivityRepository.js","sourceRoot":"","sources":["../../src/db/ActivityRepository.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/db/AnnouncementRepository.d.ts b/backend/dist/db/AnnouncementRepository.d.ts
deleted file mode 100644
index 1a8f742..0000000
--- a/backend/dist/db/AnnouncementRepository.d.ts
+++ /dev/null
@@ -1,77 +0,0 @@
-import { DatabaseClient } from '@config/database';
-import { BaseRepository, BaseEntity } from './BaseRepository';
-export interface Announcement extends BaseEntity {
- id: string;
- title: string;
- content: string;
- type: 'info' | 'warning' | 'success' | 'error' | 'feature' | 'maintenance';
- priority: 'low' | 'medium' | 'high' | 'critical';
- target_audience: 'all' | 'admins' | 'developers' | 'designers' | 'managers';
- scheduled_for?: Date | null;
- expires_at?: Date | null;
- action_button_text?: string | null;
- action_button_url?: string | null;
- image_url?: string | null;
- created_by: string;
- published: boolean;
- read_by: string[];
-}
-export interface CreateAnnouncementData {
- title: string;
- content: string;
- type: Announcement['type'];
- priority: Announcement['priority'];
- target_audience: Announcement['target_audience'];
- scheduled_for?: Date | undefined;
- expires_at?: Date | undefined;
- action_button_text?: string | undefined;
- action_button_url?: string | undefined;
- image_url?: string | undefined;
- created_by: string;
- published?: boolean | undefined;
-}
-export interface UpdateAnnouncementData {
- title?: string | undefined;
- content?: string | undefined;
- type?: Announcement['type'] | undefined;
- priority?: Announcement['priority'] | undefined;
- target_audience?: Announcement['target_audience'] | undefined;
- scheduled_for?: Date | null | undefined;
- expires_at?: Date | null | undefined;
- action_button_text?: string | null | undefined;
- action_button_url?: string | null | undefined;
- image_url?: string | null | undefined;
- published?: boolean | undefined;
-}
-export interface AnnouncementFilter {
- type?: Announcement['type'][] | undefined;
- priority?: Announcement['priority'][] | undefined;
- target_audience?: Announcement['target_audience'][] | undefined;
- published?: boolean | undefined;
- created_by?: string[] | undefined;
- date_from?: Date | undefined;
- date_to?: Date | undefined;
-}
-export default class AnnouncementRepository extends BaseRepository {
- constructor();
- create(data: CreateAnnouncementData, client?: DatabaseClient): Promise;
- update(id: string, data: UpdateAnnouncementData, client?: DatabaseClient): Promise;
- findForUser(userId: string, userRole: string, includeRead?: boolean, client?: DatabaseClient): Promise;
- markAsRead(announcementId: string, userId: string, client?: DatabaseClient): Promise;
- findWithFilter(filter: AnnouncementFilter, limit?: number, offset?: number, client?: DatabaseClient): Promise<{
- data: Announcement[];
- total: number;
- }>;
- getStats(client?: DatabaseClient): Promise<{
- total: number;
- published: number;
- scheduled: number;
- expired: number;
- byType: Record;
- byPriority: Record;
- byAudience: Record;
- }>;
- private mapRoleToAudience;
- private transformRow;
-}
-//# sourceMappingURL=AnnouncementRepository.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/db/AnnouncementRepository.d.ts.map b/backend/dist/db/AnnouncementRepository.d.ts.map
deleted file mode 100644
index a1e7a55..0000000
--- a/backend/dist/db/AnnouncementRepository.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AnnouncementRepository.d.ts","sourceRoot":"","sources":["../../src/db/AnnouncementRepository.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/db/AnnouncementRepository.js b/backend/dist/db/AnnouncementRepository.js
deleted file mode 100644
index 1b29fb3..0000000
--- a/backend/dist/db/AnnouncementRepository.js
+++ /dev/null
@@ -1,314 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-const BaseRepository_1 = require("./BaseRepository");
-const logger_1 = require("@utils/logger");
-const errors_1 = require("@utils/errors");
-class AnnouncementRepository extends BaseRepository_1.BaseRepository {
- constructor() {
- super('announcements');
- this.selectFields = [
- 'id', 'title', 'content', 'type', 'priority', 'target_audience',
- 'scheduled_for', 'expires_at', 'action_button_text', 'action_button_url',
- 'image_url', 'created_by', 'published', 'read_by', 'created_at',
- 'updated_at', 'version', 'deleted_at', 'deleted_by'
- ];
- }
- async create(data, client) {
- const now = new Date();
- // Validation
- if (!data.title?.trim()) {
- throw new errors_1.ValidationError('Title is required');
- }
- if (!data.content?.trim()) {
- throw new errors_1.ValidationError('Content is required');
- }
- if (!data.created_by) {
- throw new errors_1.ValidationError('Created by user ID is required');
- }
- const announcementData = {
- ...data,
- published: data.published ?? false,
- read_by: [],
- created_at: now,
- updated_at: now,
- version: 1
- };
- const query = `
- INSERT INTO ${this.tableName} (
- title, content, type, priority, target_audience, scheduled_for,
- expires_at, action_button_text, action_button_url, image_url,
- created_by, published, read_by, created_at, updated_at, version
- ) VALUES (
- $1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16
- ) RETURNING *
- `;
- const values = [
- announcementData.title,
- announcementData.content,
- announcementData.type,
- announcementData.priority,
- announcementData.target_audience,
- announcementData.scheduled_for || null,
- announcementData.expires_at || null,
- announcementData.action_button_text || null,
- announcementData.action_button_url || null,
- announcementData.image_url || null,
- announcementData.created_by,
- announcementData.published,
- JSON.stringify(announcementData.read_by),
- announcementData.created_at,
- announcementData.updated_at,
- announcementData.version
- ];
- try {
- const result = await this.query(query, values, client);
- logger_1.logger.info(`Created announcement: ${result.rows[0].id}`);
- return this.transformRow(result.rows[0]);
- }
- catch (error) {
- logger_1.logger.error('Failed to create announcement:', error);
- throw error;
- }
- }
- async update(id, data, client) {
- const existing = await this.findById(id, client);
- if (!existing) {
- throw new errors_1.NotFoundError(`Announcement with ID ${id} not found`);
- }
- const now = new Date();
- const updateFields = [];
- const updateValues = [];
- let paramIndex = 1;
- // Build dynamic update query
- Object.entries(data).forEach(([key, value]) => {
- if (value !== undefined) {
- updateFields.push(`${key} = $${paramIndex}`);
- updateValues.push(value);
- paramIndex++;
- }
- });
- if (updateFields.length === 0) {
- return existing;
- }
- // Add updated_at and version
- updateFields.push(`updated_at = $${paramIndex}`);
- updateValues.push(now);
- paramIndex++;
- updateFields.push(`version = $${paramIndex}`);
- updateValues.push(existing.version + 1);
- paramIndex++;
- // Add WHERE clause
- updateValues.push(id);
- updateValues.push(existing.version);
- const query = `
- UPDATE ${this.tableName}
- SET ${updateFields.join(', ')}
- WHERE id = $${paramIndex - 1} AND version = $${paramIndex} AND deleted_at IS NULL
- RETURNING *
- `;
- try {
- const result = await this.query(query, updateValues, client);
- if (result.rows.length === 0) {
- throw new Error('Concurrent update detected - announcement was modified by another process');
- }
- logger_1.logger.info(`Updated announcement: ${id}`);
- return this.transformRow(result.rows[0]);
- }
- catch (error) {
- logger_1.logger.error(`Failed to update announcement ${id}:`, error);
- throw error;
- }
- }
- async findForUser(userId, userRole, includeRead = true, client) {
- let whereConditions = ['deleted_at IS NULL', 'published = true'];
- const queryParams = [];
- let paramIndex = 1;
- // Filter by expiration
- whereConditions.push('(expires_at IS NULL OR expires_at > NOW())');
- // Filter by schedule
- whereConditions.push('(scheduled_for IS NULL OR scheduled_for <= NOW())');
- // Filter by target audience
- if (userRole !== 'ceo') {
- whereConditions.push(`(target_audience = 'all' OR target_audience = $${paramIndex})`);
- queryParams.push(this.mapRoleToAudience(userRole));
- paramIndex++;
- }
- // Filter by read status if requested
- if (!includeRead) {
- whereConditions.push(`NOT (read_by ? $${paramIndex})`);
- queryParams.push(userId);
- paramIndex++;
- }
- const query = `
- SELECT ${this.selectFields.join(', ')}
- FROM ${this.tableName}
- WHERE ${whereConditions.join(' AND ')}
- ORDER BY
- CASE priority
- WHEN 'critical' THEN 1
- WHEN 'high' THEN 2
- WHEN 'medium' THEN 3
- WHEN 'low' THEN 4
- END,
- created_at DESC
- `;
- try {
- const result = await this.query(query, queryParams, client);
- return result.rows.map(row => this.transformRow(row));
- }
- catch (error) {
- logger_1.logger.error(`Failed to find announcements for user ${userId}:`, error);
- throw error;
- }
- }
- async markAsRead(announcementId, userId, client) {
- const query = `
- UPDATE ${this.tableName}
- SET read_by = read_by || $1::jsonb,
- updated_at = NOW(),
- version = version + 1
- WHERE id = $2
- AND deleted_at IS NULL
- AND NOT (read_by ? $3)
- `;
- const values = [JSON.stringify([userId]), announcementId, userId];
- try {
- await this.query(query, values, client);
- logger_1.logger.info(`Marked announcement ${announcementId} as read by user ${userId}`);
- }
- catch (error) {
- logger_1.logger.error(`Failed to mark announcement ${announcementId} as read:`, error);
- throw error;
- }
- }
- async findWithFilter(filter, limit = 50, offset = 0, client) {
- const whereConditions = ['deleted_at IS NULL'];
- const queryParams = [];
- let paramIndex = 1;
- // Apply filters
- if (filter.type && filter.type.length > 0) {
- whereConditions.push(`type = ANY($${paramIndex})`);
- queryParams.push(filter.type);
- paramIndex++;
- }
- if (filter.priority && filter.priority.length > 0) {
- whereConditions.push(`priority = ANY($${paramIndex})`);
- queryParams.push(filter.priority);
- paramIndex++;
- }
- if (filter.target_audience && filter.target_audience.length > 0) {
- whereConditions.push(`target_audience = ANY($${paramIndex})`);
- queryParams.push(filter.target_audience);
- paramIndex++;
- }
- if (filter.published !== undefined) {
- whereConditions.push(`published = $${paramIndex}`);
- queryParams.push(filter.published);
- paramIndex++;
- }
- if (filter.created_by && filter.created_by.length > 0) {
- whereConditions.push(`created_by = ANY($${paramIndex})`);
- queryParams.push(filter.created_by);
- paramIndex++;
- }
- if (filter.date_from) {
- whereConditions.push(`created_at >= $${paramIndex}`);
- queryParams.push(filter.date_from);
- paramIndex++;
- }
- if (filter.date_to) {
- whereConditions.push(`created_at <= $${paramIndex}`);
- queryParams.push(filter.date_to);
- paramIndex++;
- }
- const whereClause = whereConditions.join(' AND ');
- // Count query
- const countQuery = `SELECT COUNT(*) FROM ${this.tableName} WHERE ${whereClause}`;
- const countResult = await this.query(countQuery, queryParams, client);
- const total = parseInt(countResult.rows[0].count);
- // Data query
- queryParams.push(limit, offset);
- const dataQuery = `
- SELECT ${this.selectFields.join(', ')}
- FROM ${this.tableName}
- WHERE ${whereClause}
- ORDER BY created_at DESC
- LIMIT $${paramIndex} OFFSET $${paramIndex + 1}
- `;
- const dataResult = await this.query(dataQuery, queryParams, client);
- const data = dataResult.rows.map(row => this.transformRow(row));
- return { data, total };
- }
- async getStats(client) {
- const query = `
- SELECT
- COUNT(*) as total,
- COUNT(CASE WHEN published = true THEN 1 END) as published,
- COUNT(CASE WHEN scheduled_for > NOW() THEN 1 END) as scheduled,
- COUNT(CASE WHEN expires_at < NOW() THEN 1 END) as expired,
- jsonb_object_agg(type, type_count) as by_type,
- jsonb_object_agg(priority, priority_count) as by_priority,
- jsonb_object_agg(target_audience, audience_count) as by_audience
- FROM ${this.tableName}
- CROSS JOIN LATERAL (
- SELECT type, COUNT(*) as type_count
- FROM ${this.tableName} t2
- WHERE t2.type = ${this.tableName}.type AND deleted_at IS NULL
- GROUP BY type
- ) type_stats
- CROSS JOIN LATERAL (
- SELECT priority, COUNT(*) as priority_count
- FROM ${this.tableName} t3
- WHERE t3.priority = ${this.tableName}.priority AND deleted_at IS NULL
- GROUP BY priority
- ) priority_stats
- CROSS JOIN LATERAL (
- SELECT target_audience, COUNT(*) as audience_count
- FROM ${this.tableName} t4
- WHERE t4.target_audience = ${this.tableName}.target_audience AND deleted_at IS NULL
- GROUP BY target_audience
- ) audience_stats
- WHERE deleted_at IS NULL
- `;
- try {
- const result = await this.query(query, [], client);
- const row = result.rows[0];
- return {
- total: parseInt(row.total) || 0,
- published: parseInt(row.published) || 0,
- scheduled: parseInt(row.scheduled) || 0,
- expired: parseInt(row.expired) || 0,
- byType: row.by_type || {},
- byPriority: row.by_priority || {},
- byAudience: row.by_audience || {},
- };
- }
- catch (error) {
- logger_1.logger.error('Failed to get announcement stats:', error);
- throw error;
- }
- }
- mapRoleToAudience(role) {
- const roleMapping = {
- 'admin': 'admins',
- 'developer': 'developers',
- 'designer': 'designers',
- 'manager': 'managers',
- 'staff': 'all'
- };
- return roleMapping[role] || 'all';
- }
- transformRow(row) {
- return {
- ...row,
- read_by: Array.isArray(row.read_by) ? row.read_by : (row.read_by ? JSON.parse(row.read_by) : []),
- created_at: new Date(row.created_at),
- updated_at: new Date(row.updated_at),
- scheduled_for: row.scheduled_for ? new Date(row.scheduled_for) : null,
- expires_at: row.expires_at ? new Date(row.expires_at) : null,
- deleted_at: row.deleted_at ? new Date(row.deleted_at) : null,
- };
- }
-}
-exports.default = AnnouncementRepository;
-//# sourceMappingURL=AnnouncementRepository.js.map
\ No newline at end of file
diff --git a/backend/dist/db/AnnouncementRepository.js.map b/backend/dist/db/AnnouncementRepository.js.map
deleted file mode 100644
index f3a37f3..0000000
--- a/backend/dist/db/AnnouncementRepository.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"AnnouncementRepository.js","sourceRoot":"","sources":["../../src/db/AnnouncementRepository.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/db/BaseRepository.d.ts b/backend/dist/db/BaseRepository.d.ts
deleted file mode 100644
index 94c903d..0000000
--- a/backend/dist/db/BaseRepository.d.ts
+++ /dev/null
@@ -1,109 +0,0 @@
-import { PoolClient } from 'pg';
-import { DatabaseClient } from '@config/database';
-/**
- * Base Repository class providing common CRUD operations
- * Implements enterprise patterns: soft delete, audit trail, optimistic locking
- */
-export interface BaseEntity {
- id: string;
- created_at: Date;
- updated_at: Date;
- version: number;
- deleted_at?: Date | null;
- deleted_by?: string | null;
-}
-export interface FilterOptions {
- limit?: number;
- offset?: number;
- orderBy?: string;
- orderDirection?: 'ASC' | 'DESC';
- includeDeleted?: boolean;
- filters?: Record;
-}
-export interface PaginatedResult {
- data: T[];
- total: number;
- limit: number;
- offset: number;
- hasMore: boolean;
-}
-export declare abstract class BaseRepository {
- protected tableName: string;
- protected primaryKey: string;
- protected selectFields: string[];
- constructor(tableName: string);
- /**
- * Create a new entity
- */
- create(data: Partial>, client?: DatabaseClient): Promise;
- /**
- * Find entity by ID
- */
- findById(id: string, includeDeleted?: boolean, client?: DatabaseClient): Promise;
- /**
- * Find entity by ID or throw NotFoundError
- */
- findByIdOrThrow(id: string, includeDeleted?: boolean, client?: DatabaseClient): Promise;
- /**
- * Update entity by ID with optimistic locking
- */
- update(id: string, data: Partial>, expectedVersion?: number, client?: DatabaseClient): Promise;
- /**
- * Soft delete entity
- */
- softDelete(id: string, deletedBy: string, client?: DatabaseClient): Promise;
- /**
- * Restore soft deleted entity
- */
- restore(id: string, client?: DatabaseClient): Promise;
- /**
- * Hard delete entity (use with caution)
- */
- hardDelete(id: string, client?: DatabaseClient): Promise;
- /**
- * Find multiple entities with filtering and pagination
- */
- findMany(options?: FilterOptions, client?: DatabaseClient): Promise>;
- /**
- * Count entities with optional filters
- */
- count(filters?: Record, includeDeleted?: boolean, client?: DatabaseClient): Promise;
- /**
- * Check if entity exists
- */
- exists(id: string, includeDeleted?: boolean, client?: DatabaseClient): Promise;
- /**
- * Execute raw SQL query within repository context
- */
- protected executeRawQuery(sql: string, params?: any[], client?: DatabaseClient): Promise<{
- rows: R[];
- rowCount: number;
- }>;
- /**
- * Execute multiple operations in a transaction
- */
- executeInTransaction(callback: (client: PoolClient) => Promise): Promise;
- /**
- * Bulk insert entities (for seeding and imports)
- */
- bulkCreate(entities: Partial>[], client?: DatabaseClient): Promise;
- /**
- * Get repository statistics
- */
- getStats(client?: DatabaseClient): Promise<{
- total: number;
- active: number;
- deleted: number;
- createdToday: number;
- updatedToday: number;
- }>;
- /**
- * Direct query method for complex database operations
- */
- query(sql: string, params?: any[], client?: DatabaseClient): Promise<{
- rows: R[];
- rowCount: number;
- }>;
-}
-export default BaseRepository;
-//# sourceMappingURL=BaseRepository.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/db/BaseRepository.d.ts.map b/backend/dist/db/BaseRepository.d.ts.map
deleted file mode 100644
index ae16590..0000000
--- a/backend/dist/db/BaseRepository.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"BaseRepository.d.ts","sourceRoot":"","sources":["../../src/db/BaseRepository.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/db/BaseRepository.js b/backend/dist/db/BaseRepository.js
deleted file mode 100644
index 77a43e8..0000000
--- a/backend/dist/db/BaseRepository.js
+++ /dev/null
@@ -1,368 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.BaseRepository = void 0;
-const database_1 = require("@config/database");
-const logger_1 = require("@utils/logger");
-const errors_1 = require("@utils/errors");
-class BaseRepository {
- tableName;
- primaryKey = 'id';
- selectFields = ['*'];
- constructor(tableName) {
- this.tableName = tableName;
- }
- /**
- * Create a new entity
- */
- async create(data, client) {
- const fields = Object.keys(data);
- const values = Object.values(data);
- const placeholders = fields.map((_, index) => `$${index + 1}`).join(', ');
- const sql = `
- INSERT INTO ${this.tableName} (${fields.join(', ')})
- VALUES (${placeholders})
- RETURNING ${this.selectFields.join(', ')}
- `;
- return logger_1.performanceLogger.trackAsyncOperation(async () => {
- const result = await (0, database_1.query)(sql, values, client);
- if (result.rows.length === 0 || result.rows[0] === undefined) {
- throw new errors_1.DatabaseError('Failed to create entity - no rows returned');
- }
- logger_1.logger.debug({
- table: this.tableName,
- operation: 'create',
- entityId: result.rows[0].id,
- }, 'Entity created successfully');
- // Ensure result.rows[0] is not undefined before returning
- if (result.rows[0] === undefined) {
- throw new errors_1.DatabaseError('Failed to create entity - undefined row returned');
- }
- return result.rows[0];
- }, `repository-create-${this.tableName}`, { entityType: this.tableName });
- }
- /**
- * Find entity by ID
- */
- async findById(id, includeDeleted = false, client) {
- const deletedCondition = includeDeleted ? '' : 'AND deleted_at IS NULL';
- const sql = `
- SELECT ${this.selectFields.join(', ')}
- FROM ${this.tableName}
- WHERE ${this.primaryKey} = $1 ${deletedCondition}
- `;
- return logger_1.performanceLogger.trackAsyncOperation(async () => {
- const result = await (0, database_1.query)(sql, [id], client);
- return result.rows[0] || null;
- }, `repository-findById-${this.tableName}`, { entityId: id });
- }
- /**
- * Find entity by ID or throw NotFoundError
- */
- async findByIdOrThrow(id, includeDeleted = false, client) {
- const entity = await this.findById(id, includeDeleted, client);
- if (!entity) {
- throw new errors_1.NotFoundError(`${this.tableName} with id ${id} not found`);
- }
- return entity;
- }
- /**
- * Update entity by ID with optimistic locking
- */
- async update(id, data, expectedVersion, client) {
- // Exclude audit fields from update data
- const { created_at, updated_at, version, deleted_at, deleted_by, ...updateData } = data;
- const fields = Object.keys(updateData);
- const values = Object.values(updateData);
- if (fields.length === 0) {
- throw new errors_1.ValidationError('No fields provided for update', []);
- }
- const setClause = fields.map((field, index) => `${field} = $${index + 2}`).join(', ');
- const versionCondition = expectedVersion ? 'AND version = $' + (fields.length + 3) : '';
- const versionParams = expectedVersion ? [expectedVersion] : [];
- const sql = `
- UPDATE ${this.tableName}
- SET ${setClause}
- WHERE ${this.primaryKey} = $1
- AND deleted_at IS NULL
- ${versionCondition}
- RETURNING ${this.selectFields.join(', ')}
- `;
- return logger_1.performanceLogger.trackAsyncOperation(async () => {
- const result = await (0, database_1.query)(sql, [id, ...values, ...versionParams], client);
- if (result.rows.length === 0) {
- if (expectedVersion) {
- throw new errors_1.ValidationError('Optimistic locking failure - entity was modified by another transaction', []);
- }
- throw new errors_1.NotFoundError(`${this.tableName} with id ${id} not found or already deleted`);
- }
- logger_1.logger.debug({
- table: this.tableName,
- operation: 'update',
- entityId: id,
- fields: fields,
- }, 'Entity updated successfully');
- if (result.rows[0] === undefined) {
- throw new errors_1.DatabaseError('Failed to update entity - undefined row returned');
- }
- return result.rows[0];
- }, `repository-update-${this.tableName}`, { entityId: id, fieldsUpdated: fields.length });
- }
- /**
- * Soft delete entity
- */
- async softDelete(id, deletedBy, client) {
- const sql = `
- UPDATE ${this.tableName}
- SET deleted_at = NOW(), deleted_by = $2
- WHERE ${this.primaryKey} = $1 AND deleted_at IS NULL
- `;
- return logger_1.performanceLogger.trackAsyncOperation(async () => {
- const result = await (0, database_1.query)(sql, [id, deletedBy], client);
- const wasDeleted = result.rowCount > 0;
- if (wasDeleted) {
- logger_1.logger.info({
- table: this.tableName,
- operation: 'softDelete',
- entityId: id,
- deletedBy: deletedBy,
- }, 'Entity soft deleted successfully');
- }
- return wasDeleted;
- }, `repository-softDelete-${this.tableName}`, { entityId: id });
- }
- /**
- * Restore soft deleted entity
- */
- async restore(id, client) {
- const sql = `
- UPDATE ${this.tableName}
- SET deleted_at = NULL, deleted_by = NULL
- WHERE ${this.primaryKey} = $1 AND deleted_at IS NOT NULL
- `;
- return logger_1.performanceLogger.trackAsyncOperation(async () => {
- const result = await (0, database_1.query)(sql, [id], client);
- const wasRestored = result.rowCount > 0;
- if (wasRestored) {
- logger_1.logger.info({
- table: this.tableName,
- operation: 'restore',
- entityId: id,
- }, 'Entity restored successfully');
- }
- return wasRestored;
- }, `repository-restore-${this.tableName}`, { entityId: id });
- }
- /**
- * Hard delete entity (use with caution)
- */
- async hardDelete(id, client) {
- const sql = `DELETE FROM ${this.tableName} WHERE ${this.primaryKey} = $1`;
- return logger_1.performanceLogger.trackAsyncOperation(async () => {
- const result = await (0, database_1.query)(sql, [id], client);
- const wasDeleted = result.rowCount > 0;
- if (wasDeleted) {
- logger_1.logger.warn({
- table: this.tableName,
- operation: 'hardDelete',
- entityId: id,
- }, 'Entity permanently deleted');
- }
- return wasDeleted;
- }, `repository-hardDelete-${this.tableName}`, { entityId: id });
- }
- /**
- * Find multiple entities with filtering and pagination
- */
- async findMany(options = {}, client) {
- const { limit = 20, offset = 0, orderBy = 'created_at', orderDirection = 'DESC', includeDeleted = false, filters = {}, } = options;
- // Build WHERE conditions
- const whereConditions = [];
- const values = [];
- let paramCounter = 1;
- // Soft delete condition
- if (!includeDeleted) {
- whereConditions.push('deleted_at IS NULL');
- }
- // Additional filters
- Object.entries(filters).forEach(([field, value]) => {
- if (value !== undefined && value !== null) {
- if (Array.isArray(value)) {
- whereConditions.push(`${field} = ANY($${paramCounter})`);
- values.push(value);
- }
- else {
- whereConditions.push(`${field} = $${paramCounter}`);
- values.push(value);
- }
- paramCounter++;
- }
- });
- const whereClause = whereConditions.length > 0 ? `WHERE ${whereConditions.join(' AND ')}` : '';
- // Count query
- const countSql = `
- SELECT COUNT(*) as total
- FROM ${this.tableName}
- ${whereClause}
- `;
- // Data query
- const dataSql = `
- SELECT ${this.selectFields.join(', ')}
- FROM ${this.tableName}
- ${whereClause}
- ORDER BY ${orderBy} ${orderDirection}
- LIMIT $${paramCounter} OFFSET $${paramCounter + 1}
- `;
- return logger_1.performanceLogger.trackAsyncOperation(async () => {
- // Execute both queries in parallel for better performance
- const [countResult, dataResult] = await Promise.all([
- (0, database_1.query)(countSql, values, client),
- (0, database_1.query)(dataSql, [...values, limit, offset], client),
- ]);
- const total = countResult.rows[0]?.total ? parseInt(countResult.rows[0].total, 10) : 0;
- const data = dataResult.rows;
- const hasMore = offset + limit < total;
- return {
- data,
- total,
- limit,
- offset,
- hasMore,
- };
- }, `repository-findMany-${this.tableName}`, { limit, offset, filterCount: Object.keys(filters).length });
- }
- /**
- * Count entities with optional filters
- */
- async count(filters = {}, includeDeleted = false, client) {
- const whereConditions = [];
- const values = [];
- let paramCounter = 1;
- // Soft delete condition
- if (!includeDeleted) {
- whereConditions.push('deleted_at IS NULL');
- }
- // Additional filters
- Object.entries(filters).forEach(([field, value]) => {
- if (value !== undefined && value !== null) {
- whereConditions.push(`${field} = $${paramCounter}`);
- values.push(value);
- paramCounter++;
- }
- });
- const whereClause = whereConditions.length > 0 ? `WHERE ${whereConditions.join(' AND ')}` : '';
- const sql = `
- SELECT COUNT(*) as total
- FROM ${this.tableName}
- ${whereClause}
- `;
- return logger_1.performanceLogger.trackAsyncOperation(async () => {
- const result = await (0, database_1.query)(sql, values, client);
- return result.rows[0]?.total ? parseInt(result.rows[0].total, 10) : 0;
- }, `repository-count-${this.tableName}`, { filterCount: Object.keys(filters).length });
- }
- /**
- * Check if entity exists
- */
- async exists(id, includeDeleted = false, client) {
- const deletedCondition = includeDeleted ? '' : 'AND deleted_at IS NULL';
- const sql = `
- SELECT 1 FROM ${this.tableName}
- WHERE ${this.primaryKey} = $1 ${deletedCondition}
- LIMIT 1
- `;
- const result = await (0, database_1.query)(sql, [id], client);
- return result.rows.length > 0;
- }
- /**
- * Execute raw SQL query within repository context
- */
- async executeRawQuery(sql, params = [], client) {
- return logger_1.performanceLogger.trackAsyncOperation(async () => {
- const result = await (0, database_1.query)(sql, params, client);
- logger_1.logger.debug({
- table: this.tableName,
- operation: 'rawQuery',
- sql: sql.substring(0, 100) + (sql.length > 100 ? '...' : ''),
- paramCount: params.length,
- rowCount: result.rowCount,
- }, 'Raw query executed');
- return result;
- }, `repository-rawQuery-${this.tableName}`, { paramCount: params.length });
- }
- /**
- * Execute multiple operations in a transaction
- */
- async executeInTransaction(callback) {
- return (0, database_1.transaction)(callback);
- }
- /**
- * Bulk insert entities (for seeding and imports)
- */
- async bulkCreate(entities, client) {
- if (entities.length === 0) {
- return [];
- }
- // Get all unique field names
- const allFields = new Set();
- entities.forEach((entity) => {
- Object.keys(entity).forEach((field) => allFields.add(field));
- });
- const fields = Array.from(allFields);
- const values = [];
- const valuePlaceholders = [];
- entities.forEach((entity, entityIndex) => {
- const entityValues = fields.map((field) => entity[field] ?? null);
- values.push(...entityValues);
- const startParam = entityIndex * fields.length + 1;
- const entityPlaceholders = fields.map((_, fieldIndex) => `$${startParam + fieldIndex}`);
- valuePlaceholders.push(`(${entityPlaceholders.join(', ')})`);
- });
- const sql = `
- INSERT INTO ${this.tableName} (${fields.join(', ')})
- VALUES ${valuePlaceholders.join(', ')}
- RETURNING ${this.selectFields.join(', ')}
- `;
- return logger_1.performanceLogger.trackAsyncOperation(async () => {
- const result = await (0, database_1.query)(sql, values, client);
- logger_1.logger.info({
- table: this.tableName,
- operation: 'bulkCreate',
- entityCount: entities.length,
- fieldsCount: fields.length,
- }, 'Bulk create completed successfully');
- return result.rows;
- }, `repository-bulkCreate-${this.tableName}`, { entityCount: entities.length });
- }
- /**
- * Get repository statistics
- */
- async getStats(client) {
- const sql = `
- SELECT
- COUNT(*) as total,
- COUNT(*) FILTER (WHERE deleted_at IS NULL) as active,
- COUNT(*) FILTER (WHERE deleted_at IS NOT NULL) as deleted,
- COUNT(*) FILTER (WHERE DATE(created_at) = CURRENT_DATE) as created_today,
- COUNT(*) FILTER (WHERE DATE(updated_at) = CURRENT_DATE AND updated_at::date > created_at::date) as updated_today
- FROM ${this.tableName}
- `;
- const result = await (0, database_1.query)(sql, [], client);
- const stats = result.rows[0];
- return {
- total: parseInt(stats.total, 10),
- active: parseInt(stats.active, 10),
- deleted: parseInt(stats.deleted, 10),
- createdToday: parseInt(stats.created_today, 10),
- updatedToday: parseInt(stats.updated_today, 10),
- };
- }
- /**
- * Direct query method for complex database operations
- */
- async query(sql, params = [], client) {
- return this.executeRawQuery(sql, params, client);
- }
-}
-exports.BaseRepository = BaseRepository;
-exports.default = BaseRepository;
-//# sourceMappingURL=BaseRepository.js.map
\ No newline at end of file
diff --git a/backend/dist/db/BaseRepository.js.map b/backend/dist/db/BaseRepository.js.map
deleted file mode 100644
index f66b79d..0000000
--- a/backend/dist/db/BaseRepository.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"BaseRepository.js","sourceRoot":"","sources":["../../src/db/BaseRepository.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/db/ChannelRepository.d.ts b/backend/dist/db/ChannelRepository.d.ts
deleted file mode 100644
index ca25b30..0000000
--- a/backend/dist/db/ChannelRepository.d.ts
+++ /dev/null
@@ -1,146 +0,0 @@
-import { DatabaseClient } from '@config/database';
-import BaseRepository, { BaseEntity } from './BaseRepository';
-export interface Channel extends BaseEntity {
- name: string;
- description?: string;
- category_id?: string;
- channel_type: 'project' | 'department' | 'initiative' | 'temporary' | 'emergency' | 'announcement';
- privacy_level: 'public' | 'private' | 'restricted';
- status: 'active' | 'archived' | 'paused' | 'completed';
- created_by: string;
- owned_by: string;
- moderators: string[];
- members: string[];
- member_count: number;
- max_members: number;
- auto_join_roles: string[];
- settings: Record;
- integrations: Record;
- activity_stats: Record;
- project_info: Record;
- schedule: Record;
- archived_at?: Date;
- archived_by?: string;
- archive_reason?: string;
- retention_until?: Date;
- last_activity_at: Date;
-}
-export interface CreateChannelData {
- name: string;
- description?: string;
- category_id?: string;
- channel_type?: Channel['channel_type'];
- privacy_level?: Channel['privacy_level'];
- created_by: string;
- owned_by?: string;
- members?: string[];
- moderators?: string[];
- max_members?: number;
- auto_join_roles?: string[];
- settings?: Record;
- project_info?: Record;
- integrations?: Record;
-}
-export interface ChannelWithDetails extends Channel {
- category_name?: string;
- owner_name?: string;
- member_details?: Array<{
- id: string;
- name: string;
- email: string;
- role: string;
- avatar_url?: string;
- }>;
-}
-declare class ChannelRepository extends BaseRepository {
- constructor();
- /**
- * Create new channel with validation
- */
- createChannel(channelData: CreateChannelData, client?: DatabaseClient): Promise;
- /**
- * Find channel by category and name
- */
- findByCategoryAndName(categoryId: string, name: string, client?: DatabaseClient): Promise;
- /**
- * Find channels by category
- */
- findByCategory(categoryId: string, includeDeleted?: boolean, client?: DatabaseClient): Promise;
- /**
- * Find channels where user is a member
- */
- findByMember(userId: string, includeDeleted?: boolean, client?: DatabaseClient): Promise;
- /**
- * Find channels accessible by user (considering role and privacy)
- */
- findAccessibleByUser(userId: string, userRole: string, client?: DatabaseClient): Promise;
- /**
- * Add member to channel
- */
- addMember(channelId: string, userId: string, addedBy: string, client?: DatabaseClient): Promise;
- /**
- * Remove member from channel
- */
- removeMember(channelId: string, userId: string, removedBy: string, client?: DatabaseClient): Promise;
- /**
- * Add multiple members to channel
- */
- addMembers(channelId: string, userIds: string[], addedBy: string, client?: DatabaseClient): Promise;
- /**
- * Get channel with detailed member information
- */
- findWithMembers(channelId: string, client?: DatabaseClient): Promise;
- /**
- * Search channels by name or description
- */
- searchChannels(searchTerm: string, userId?: string, userRole?: string, limit?: number, offset?: number, client?: DatabaseClient): Promise;
- /**
- * Get channels by status
- */
- findByStatus(status: Channel['status'], limit?: number, client?: DatabaseClient): Promise;
- /**
- * Archive channel
- */
- archiveChannel(channelId: string, archivedBy: string, reason?: string, client?: DatabaseClient): Promise;
- /**
- * Restore archived channel
- */
- restoreChannel(channelId: string, client?: DatabaseClient): Promise;
- /**
- * Update channel activity timestamp
- */
- updateActivity(channelId: string, client?: DatabaseClient): Promise;
- /**
- * Get channels requiring attention (no recent activity)
- */
- getInactiveChannels(daysSinceActivity?: number, client?: DatabaseClient): Promise;
- /**
- * Get channel statistics
- */
- getChannelStats(client?: DatabaseClient): Promise<{
- totalChannels: number;
- activeChannels: number;
- channelsByType: Record;
- channelsByPrivacy: Record;
- averageMembers: number;
- mostActiveChannels: Array<{
- id: string;
- name: string;
- activity_count: number;
- }>;
- }>;
- /**
- * Find channels for a specific user
- */
- findUserChannels(userId: string, client?: DatabaseClient): Promise;
- /**
- * Get channel members
- */
- getMembers(channelId: string, client?: DatabaseClient): Promise;
- /**
- * Check if user can access channel
- */
- canUserAccess(channelId: string, userId: string, userRole: string, client?: DatabaseClient): Promise;
-}
-export default ChannelRepository;
-//# sourceMappingURL=ChannelRepository.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/db/ChannelRepository.d.ts.map b/backend/dist/db/ChannelRepository.d.ts.map
deleted file mode 100644
index dd019be..0000000
--- a/backend/dist/db/ChannelRepository.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ChannelRepository.d.ts","sourceRoot":"","sources":["../../src/db/ChannelRepository.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/db/ChannelRepository.js b/backend/dist/db/ChannelRepository.js
deleted file mode 100644
index 7eeefe4..0000000
--- a/backend/dist/db/ChannelRepository.js
+++ /dev/null
@@ -1,476 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const logger_1 = require("@utils/logger");
-const errors_1 = require("@utils/errors");
-const BaseRepository_1 = __importDefault(require("./BaseRepository"));
-class ChannelRepository extends BaseRepository_1.default {
- constructor() {
- super('channels');
- }
- /**
- * Create new channel with validation
- */
- async createChannel(channelData, client) {
- // Check for duplicate name within category
- if (channelData.category_id) {
- const existingChannel = await this.findByCategoryAndName(channelData.category_id, channelData.name, client);
- if (existingChannel) {
- throw new errors_1.ConflictError('Channel name already exists in this category', {
- name: channelData.name,
- categoryId: channelData.category_id,
- });
- }
- }
- // Set defaults
- const channelToCreate = {
- ...channelData,
- owned_by: channelData.owned_by || channelData.created_by,
- channel_type: channelData.channel_type || 'project',
- privacy_level: channelData.privacy_level || 'public',
- status: 'active',
- members: channelData.members || [channelData.created_by],
- moderators: channelData.moderators || [channelData.created_by],
- member_count: channelData.members?.length || 1,
- max_members: channelData.max_members || 100,
- auto_join_roles: channelData.auto_join_roles || [],
- settings: {
- allow_voice_commands: true,
- voice_command_roles: ['ceo', 'manager'],
- allow_file_uploads: true,
- ...channelData.settings,
- },
- integrations: {
- ai_assistant_enabled: true,
- task_creation_enabled: true,
- ...channelData.integrations,
- },
- activity_stats: {
- total_messages: 0,
- total_files: 0,
- total_tasks: 0,
- last_activity: null,
- },
- project_info: channelData.project_info || {},
- schedule: {
- timezone: 'UTC',
- working_hours: {
- monday: { start: '09:00', end: '17:00' },
- tuesday: { start: '09:00', end: '17:00' },
- wednesday: { start: '09:00', end: '17:00' },
- thursday: { start: '09:00', end: '17:00' },
- friday: { start: '09:00', end: '17:00' },
- saturday: null,
- sunday: null,
- },
- },
- };
- const channel = await this.create(channelToCreate, client);
- logger_1.logger.info({
- channelId: channel.id,
- name: channel.name,
- createdBy: channel.created_by,
- memberCount: channel.member_count,
- }, 'Channel created successfully');
- return channel;
- }
- /**
- * Find channel by category and name
- */
- async findByCategoryAndName(categoryId, name, client) {
- const sql = `
- SELECT ${this.selectFields.join(', ')}
- FROM ${this.tableName}
- WHERE category_id = $1
- AND LOWER(name) = LOWER($2)
- AND deleted_at IS NULL
- `;
- const result = await this.executeRawQuery(sql, [categoryId, name], client);
- return result.rows[0] || null;
- }
- /**
- * Find channels by category
- */
- async findByCategory(categoryId, includeDeleted = false, client) {
- const options = {
- filters: { category_id: categoryId },
- includeDeleted,
- orderBy: 'last_activity_at',
- orderDirection: 'DESC',
- };
- const result = await this.findMany(options, client);
- return result.data;
- }
- /**
- * Find channels where user is a member
- */
- async findByMember(userId, includeDeleted = false, client) {
- const deletedCondition = includeDeleted ? '' : 'AND deleted_at IS NULL';
- const sql = `
- SELECT ${this.selectFields.join(', ')}
- FROM ${this.tableName}
- WHERE $1 = ANY(members) ${deletedCondition}
- ORDER BY last_activity_at DESC
- `;
- const result = await this.executeRawQuery(sql, [userId], client);
- return result.rows;
- }
- /**
- * Find channels accessible by user (considering role and privacy)
- */
- async findAccessibleByUser(userId, userRole, client) {
- const sql = `
- SELECT ${this.selectFields.join(', ')}
- FROM ${this.tableName}
- WHERE deleted_at IS NULL
- AND (
- -- Public channels
- privacy_level = 'public'
- -- User is a member
- OR $1 = ANY(members)
- -- CEO can access all channels
- OR $2 = 'ceo'
- -- Restricted channels with role access
- OR (privacy_level = 'restricted' AND $2 = ANY(auto_join_roles))
- )
- ORDER BY
- CASE WHEN $1 = ANY(members) THEN 1 ELSE 2 END,
- last_activity_at DESC
- `;
- const result = await this.executeRawQuery(sql, [userId, userRole], client);
- return result.rows;
- }
- /**
- * Add member to channel
- */
- async addMember(channelId, userId, addedBy, client) {
- const sql = `
- SELECT add_channel_member($1, $2, $3)
- `;
- try {
- const result = await this.executeRawQuery(sql, [channelId, userId, addedBy], client);
- const success = result.rows[0]?.add_channel_member || false;
- if (success) {
- logger_1.logger.info({
- channelId,
- userId,
- addedBy,
- }, 'Member added to channel');
- }
- return success;
- }
- catch (error) {
- logger_1.logger.error({ error, channelId, userId }, 'Failed to add member to channel');
- throw error;
- }
- }
- /**
- * Remove member from channel
- */
- async removeMember(channelId, userId, removedBy, client) {
- const sql = `
- SELECT remove_channel_member($1, $2, $3)
- `;
- try {
- const result = await this.executeRawQuery(sql, [channelId, userId, removedBy], client);
- const success = result.rows[0]?.remove_channel_member || false;
- if (success) {
- logger_1.logger.info({
- channelId,
- userId,
- removedBy,
- }, 'Member removed from channel');
- }
- return success;
- }
- catch (error) {
- logger_1.logger.error({ error, channelId, userId }, 'Failed to remove member from channel');
- throw error;
- }
- }
- /**
- * Add multiple members to channel
- */
- async addMembers(channelId, userIds, addedBy, client) {
- const successfulAdds = [];
- for (const userId of userIds) {
- try {
- const success = await this.addMember(channelId, userId, addedBy, client);
- if (success) {
- successfulAdds.push(userId);
- }
- }
- catch (error) {
- logger_1.logger.warn({ error, channelId, userId }, 'Failed to add individual member');
- }
- }
- return successfulAdds;
- }
- /**
- * Get channel with detailed member information
- */
- async findWithMembers(channelId, client) {
- const sql = `
- SELECT
- c.*,
- cat.name as category_name,
- owner.name as owner_name,
- ARRAY(
- SELECT json_build_object(
- 'id', u.id,
- 'name', u.name,
- 'email', u.email,
- 'role', u.role,
- 'avatar_url', u.avatar_url
- )
- FROM users u
- WHERE u.id = ANY(c.members)
- AND u.deleted_at IS NULL
- ORDER BY u.name
- ) as member_details
- FROM channels c
- LEFT JOIN categories cat ON c.category_id = cat.id
- LEFT JOIN users owner ON c.owned_by = owner.id
- WHERE c.id = $1 AND c.deleted_at IS NULL
- `;
- const result = await this.executeRawQuery(sql, [channelId], client);
- return result.rows[0] || null;
- }
- /**
- * Search channels by name or description
- */
- async searchChannels(searchTerm, userId, userRole, limit = 20, offset = 0, client) {
- let accessCondition = '';
- let params = [`%${searchTerm}%`, limit, offset];
- if (userId && userRole) {
- accessCondition = `
- AND (
- privacy_level = 'public'
- OR $4 = ANY(members)
- OR $5 = 'ceo'
- OR (privacy_level = 'restricted' AND $5 = ANY(auto_join_roles))
- )
- `;
- params.push(userId, userRole);
- }
- const sql = `
- SELECT ${this.selectFields.join(', ')}
- FROM ${this.tableName}
- WHERE (
- LOWER(name) LIKE LOWER($1) OR
- LOWER(description) LIKE LOWER($1)
- )
- AND deleted_at IS NULL
- AND status = 'active'
- ${accessCondition}
- ORDER BY
- CASE WHEN LOWER(name) LIKE LOWER($1) THEN 1 ELSE 2 END,
- last_activity_at DESC
- LIMIT $2 OFFSET $3
- `;
- const result = await this.executeRawQuery(sql, params, client);
- return result.rows;
- }
- /**
- * Get channels by status
- */
- async findByStatus(status, limit, client) {
- const options = {
- filters: { status },
- orderBy: 'last_activity_at',
- orderDirection: 'DESC',
- ...(limit !== undefined ? { limit } : {}),
- };
- const result = await this.findMany(options, client);
- return result.data;
- }
- /**
- * Archive channel
- */
- async archiveChannel(channelId, archivedBy, reason, client) {
- const sql = `
- UPDATE ${this.tableName}
- SET
- status = 'archived',
- archived_at = NOW(),
- archived_by = $2,
- archive_reason = $3
- WHERE id = $1 AND deleted_at IS NULL
- `;
- const result = await this.executeRawQuery(sql, [channelId, archivedBy, reason || 'Manual archive'], client);
- if (result.rowCount > 0) {
- logger_1.logger.info({
- channelId,
- archivedBy,
- reason,
- }, 'Channel archived successfully');
- }
- return result.rowCount > 0;
- }
- /**
- * Restore archived channel
- */
- async restoreChannel(channelId, client) {
- const sql = `
- UPDATE ${this.tableName}
- SET
- status = 'active',
- archived_at = NULL,
- archived_by = NULL,
- archive_reason = NULL
- WHERE id = $1 AND deleted_at IS NULL AND status = 'archived'
- `;
- const result = await this.executeRawQuery(sql, [channelId], client);
- if (result.rowCount > 0) {
- logger_1.logger.info({ channelId }, 'Channel restored successfully');
- }
- return result.rowCount > 0;
- }
- /**
- * Update channel activity timestamp
- */
- async updateActivity(channelId, client) {
- const sql = `
- UPDATE ${this.tableName}
- SET last_activity_at = NOW()
- WHERE id = $1 AND deleted_at IS NULL
- `;
- await this.executeRawQuery(sql, [channelId], client);
- }
- /**
- * Get channels requiring attention (no recent activity)
- */
- async getInactiveChannels(daysSinceActivity = 30, client) {
- const sql = `
- SELECT ${this.selectFields.join(', ')}
- FROM ${this.tableName}
- WHERE last_activity_at < NOW() - INTERVAL '${daysSinceActivity} days'
- AND status = 'active'
- AND deleted_at IS NULL
- ORDER BY last_activity_at ASC
- `;
- const result = await this.executeRawQuery(sql, [], client);
- return result.rows;
- }
- /**
- * Get channel statistics
- */
- async getChannelStats(client) {
- const statsSql = `
- SELECT
- COUNT(*) as total_channels,
- COUNT(*) FILTER (WHERE status = 'active') as active_channels,
- COUNT(*) FILTER (WHERE channel_type = 'project') as project_channels,
- COUNT(*) FILTER (WHERE channel_type = 'department') as department_channels,
- COUNT(*) FILTER (WHERE channel_type = 'initiative') as initiative_channels,
- COUNT(*) FILTER (WHERE channel_type = 'temporary') as temporary_channels,
- COUNT(*) FILTER (WHERE privacy_level = 'public') as public_channels,
- COUNT(*) FILTER (WHERE privacy_level = 'private') as private_channels,
- COUNT(*) FILTER (WHERE privacy_level = 'restricted') as restricted_channels,
- AVG(member_count) as average_members
- FROM ${this.tableName}
- WHERE deleted_at IS NULL
- `;
- const mostActiveSql = `
- SELECT id, name,
- COALESCE((activity_stats->>'total_messages')::int, 0) +
- COALESCE((activity_stats->>'total_tasks')::int, 0) as activity_count
- FROM ${this.tableName}
- WHERE deleted_at IS NULL
- AND status = 'active'
- ORDER BY activity_count DESC
- LIMIT 10
- `;
- const [statsResult, activeResult] = await Promise.all([
- this.executeRawQuery(statsSql, [], client),
- this.executeRawQuery(mostActiveSql, [], client),
- ]);
- const stats = statsResult.rows[0];
- return {
- totalChannels: parseInt(stats.total_channels, 10),
- activeChannels: parseInt(stats.active_channels, 10),
- channelsByType: {
- project: parseInt(stats.project_channels, 10),
- department: parseInt(stats.department_channels, 10),
- initiative: parseInt(stats.initiative_channels, 10),
- temporary: parseInt(stats.temporary_channels, 10),
- },
- channelsByPrivacy: {
- public: parseInt(stats.public_channels, 10),
- private: parseInt(stats.private_channels, 10),
- restricted: parseInt(stats.restricted_channels, 10),
- },
- averageMembers: parseFloat(stats.average_members || '0'),
- mostActiveChannels: activeResult.rows.map((row) => ({
- id: row.id,
- name: row.name,
- activity_count: parseInt(row.activity_count, 10),
- })),
- };
- }
- /**
- * Find channels for a specific user
- */
- async findUserChannels(userId, client) {
- const sql = `
- SELECT ${this.selectFields.join(', ')}
- FROM ${this.tableName}
- WHERE $1 = ANY(members)
- AND deleted_at IS NULL
- AND status = 'active'
- ORDER BY last_activity_at DESC
- `;
- const result = await this.executeRawQuery(sql, [userId], client);
- return result.rows;
- }
- /**
- * Get channel members
- */
- async getMembers(channelId, client) {
- const sql = `
- SELECT u.id, u.name, u.email, u.role, u.avatar_url
- FROM users u
- JOIN ${this.tableName} c ON u.id = ANY(c.members)
- WHERE c.id = $1 AND c.deleted_at IS NULL
- AND u.deleted_at IS NULL
- `;
- const result = await this.executeRawQuery(sql, [channelId], client);
- return result.rows;
- }
- /**
- * Check if user can access channel
- */
- async canUserAccess(channelId, userId, userRole, client) {
- const sql = `
- SELECT id, privacy_level, members, created_by
- FROM ${this.tableName}
- WHERE id = $1 AND deleted_at IS NULL
- `;
- const result = await this.executeRawQuery(sql, [channelId], client);
- if (result.rows.length === 0) {
- return false;
- }
- const channel = result.rows[0];
- // CEO can access any channel
- if (userRole === 'ceo') {
- return true;
- }
- // Creator can always access
- if (channel.created_by === userId) {
- return true;
- }
- // Check if user is a member
- if (channel.members && channel.members.includes(userId)) {
- return true;
- }
- // Public channels are accessible to all
- if (channel.privacy_level === 'public') {
- return true;
- }
- return false;
- }
-}
-exports.default = ChannelRepository;
-//# sourceMappingURL=ChannelRepository.js.map
\ No newline at end of file
diff --git a/backend/dist/db/ChannelRepository.js.map b/backend/dist/db/ChannelRepository.js.map
deleted file mode 100644
index 9d18b4a..0000000
--- a/backend/dist/db/ChannelRepository.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"ChannelRepository.js","sourceRoot":"","sources":["../../src/db/ChannelRepository.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/db/FileRepository.d.ts b/backend/dist/db/FileRepository.d.ts
deleted file mode 100644
index 1d755bc..0000000
--- a/backend/dist/db/FileRepository.d.ts
+++ /dev/null
@@ -1,148 +0,0 @@
-import { DatabaseClient } from '@config/database';
-import BaseRepository, { BaseEntity } from './BaseRepository';
-export interface FileEntity extends BaseEntity {
- filename: string;
- original_name: string;
- mime_type: string;
- size: number;
- url: string;
- download_url?: string;
- thumbnail_url?: string;
- uploaded_by: string;
- channel_id?: string;
- task_id?: string;
- message_id?: string;
- file_path: string;
- storage_provider: 'local' | 'aws_s3' | 'gcs' | 'azure';
- storage_key: string;
- checksum: string;
- metadata: Record;
- access_count: number;
- last_accessed_at?: Date;
- virus_scan_status: 'pending' | 'clean' | 'infected' | 'error';
- virus_scan_result?: Record;
- expires_at?: Date;
- is_public: boolean;
- download_count: number;
-}
-export interface CreateFileData {
- filename: string;
- originalName: string;
- mimeType: string;
- size: number;
- url: string;
- downloadUrl?: string;
- thumbnailUrl?: string;
- uploadedBy: string;
- channelId?: string;
- taskId?: string;
- messageId?: string;
- filePath: string;
- storageProvider?: FileEntity['storage_provider'];
- storageKey: string;
- checksum: string;
- metadata?: Record;
- isPublic?: boolean;
- expiresAt?: Date;
-}
-export interface FileWithUploader extends FileEntity {
- uploader_name: string;
- uploader_email: string;
- uploader_avatar?: string;
- channel_name?: string;
- task_title?: string;
-}
-declare class FileRepository extends BaseRepository {
- constructor();
- /**
- * Create new file record with validation
- */
- createFile(fileData: CreateFileData, client?: DatabaseClient): Promise;
- /**
- * Find files by channel
- */
- findChannelFiles(channelId: string, filters?: {
- fileType?: string;
- uploadedBy?: string;
- search?: string;
- after?: Date;
- before?: Date;
- }, limit?: number, offset?: number, client?: DatabaseClient): Promise;
- /**
- * Get channel file count
- */
- getChannelFileCount(channelId: string, filters?: {
- fileType?: string;
- uploadedBy?: string;
- search?: string;
- after?: Date;
- before?: Date;
- }, client?: DatabaseClient): Promise;
- /**
- * Find files by task
- */
- findTaskFiles(taskId: string, limit?: number, offset?: number, client?: DatabaseClient): Promise;
- /**
- * Find files by user
- */
- findUserFiles(userId: string, filters?: {
- channelId?: string;
- taskId?: string;
- fileType?: string;
- }, limit?: number, offset?: number, client?: DatabaseClient): Promise;
- /**
- * Search files by name or content
- */
- searchFiles(searchTerm: string, options?: {
- userId?: string;
- channelId?: string;
- taskId?: string;
- fileType?: string;
- }, limit?: number, offset?: number, client?: DatabaseClient): Promise;
- /**
- * Update file access tracking
- */
- recordFileAccess(fileId: string, client?: DatabaseClient): Promise;
- /**
- * Update file download count
- */
- recordFileDownload(fileId: string, client?: DatabaseClient): Promise;
- /**
- * Update virus scan status
- */
- updateVirusScanStatus(fileId: string, status: FileEntity['virus_scan_status'], result?: Record, client?: DatabaseClient): Promise;
- /**
- * Get file statistics
- */
- getFileStats(client?: DatabaseClient): Promise<{
- totalFiles: number;
- totalSize: number;
- filesByType: Record;
- filesByProvider: Record;
- virusScannedFiles: number;
- infectedFiles: number;
- mostDownloadedFiles: Array<{
- id: string;
- filename: string;
- downloadCount: number;
- }>;
- }>;
- /**
- * Clean up expired files
- */
- cleanupExpiredFiles(client?: DatabaseClient): Promise;
- /**
- * Get allowed mime types
- */
- private getAllowedMimeTypes;
- /**
- * Check if mime type is allowed
- */
- isMimeTypeAllowed(mimeType: string): boolean;
- /**
- * Get file category from mime type
- */
- getFileCategory(mimeType: string): string;
-}
-export default FileRepository;
-//# sourceMappingURL=FileRepository.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/db/FileRepository.d.ts.map b/backend/dist/db/FileRepository.d.ts.map
deleted file mode 100644
index 109a82b..0000000
--- a/backend/dist/db/FileRepository.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"FileRepository.d.ts","sourceRoot":"","sources":["../../src/db/FileRepository.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/db/FileRepository.js b/backend/dist/db/FileRepository.js
deleted file mode 100644
index 8d86937..0000000
--- a/backend/dist/db/FileRepository.js
+++ /dev/null
@@ -1,505 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const logger_1 = require("@utils/logger");
-const errors_1 = require("@utils/errors");
-const BaseRepository_1 = __importDefault(require("./BaseRepository"));
-class FileRepository extends BaseRepository_1.default {
- constructor() {
- super('files');
- }
- /**
- * Create new file record with validation
- */
- async createFile(fileData, client) {
- // Validate file size (100MB default max)
- const maxSize = 100 * 1024 * 1024; // 100MB
- if (fileData.size > maxSize) {
- throw new errors_1.ValidationError('File size exceeds maximum allowed size', [
- { field: 'size', message: `File size must be less than ${maxSize} bytes` },
- ]);
- }
- // Validate mime type
- const allowedTypes = this.getAllowedMimeTypes();
- if (!allowedTypes.includes(fileData.mimeType)) {
- throw new errors_1.ValidationError('Unsupported file type', [
- { field: 'mimeType', message: `File type ${fileData.mimeType} is not allowed` },
- ]);
- }
- const fileToCreate = {
- filename: fileData.filename,
- original_name: fileData.originalName,
- mime_type: fileData.mimeType,
- size: fileData.size,
- url: fileData.url,
- download_url: fileData.downloadUrl ?? '',
- thumbnail_url: fileData.thumbnailUrl ?? '',
- uploaded_by: fileData.uploadedBy,
- channel_id: fileData.channelId ?? '',
- task_id: fileData.taskId ?? '',
- message_id: fileData.messageId ?? '',
- file_path: fileData.filePath,
- storage_provider: fileData.storageProvider || 'local',
- storage_key: fileData.storageKey,
- checksum: fileData.checksum,
- metadata: fileData.metadata || {},
- access_count: 0,
- virus_scan_status: 'pending',
- is_public: fileData.isPublic || false,
- download_count: 0,
- ...(fileData.expiresAt ? { expires_at: fileData.expiresAt } : {}),
- };
- const file = await this.create(fileToCreate, client);
- logger_1.logger.info({
- fileId: file.id,
- filename: file.filename,
- size: file.size,
- uploadedBy: file.uploaded_by,
- channelId: file.channel_id,
- taskId: file.task_id,
- }, 'File created successfully');
- return file;
- }
- /**
- * Find files by channel
- */
- async findChannelFiles(channelId, filters, limit = 50, offset = 0, client) {
- let whereConditions = ['fel.entity_type = \'channel\'', 'fel.entity_id = $1', 'f.deleted_at IS NULL'];
- let params = [channelId];
- let paramIndex = 2;
- // Add filters
- if (filters?.fileType) {
- whereConditions.push(`f.mime_type LIKE $${paramIndex}`);
- params.push(`${filters.fileType}%`);
- paramIndex++;
- }
- if (filters?.uploadedBy) {
- whereConditions.push(`f.uploaded_by = $${paramIndex}`);
- params.push(filters.uploadedBy);
- paramIndex++;
- }
- if (filters?.search) {
- whereConditions.push(`(
- LOWER(f.filename) LIKE LOWER($${paramIndex}) OR
- LOWER(f.original_name) LIKE LOWER($${paramIndex})
- )`);
- params.push(`%${filters.search}%`);
- paramIndex++;
- }
- if (filters?.after) {
- whereConditions.push(`f.uploaded_at > $${paramIndex}`);
- params.push(filters.after);
- paramIndex++;
- }
- if (filters?.before) {
- whereConditions.push(`f.uploaded_at < $${paramIndex}`);
- params.push(filters.before);
- paramIndex++;
- }
- const sql = `
- SELECT
- f.*,
- u.name as uploader_name,
- u.email as uploader_email,
- u.avatar_url as uploader_avatar,
- c.name as channel_name,
- t.title as task_title
- FROM ${this.tableName} f
- INNER JOIN file_entity_links fel ON f.id = fel.file_id
- LEFT JOIN users u ON f.uploaded_by = u.id
- LEFT JOIN channels c ON fel.entity_id = c.id AND fel.entity_type = 'channel'
- LEFT JOIN tasks t ON fel.entity_id = t.id AND fel.entity_type = 'task'
- WHERE ${whereConditions.join(' AND ')}
- ORDER BY f.uploaded_at DESC
- LIMIT $${paramIndex} OFFSET $${paramIndex + 1}
- `;
- params.push(limit, offset);
- const result = await this.executeRawQuery(sql, params, client);
- return result.rows;
- }
- /**
- * Get channel file count
- */
- async getChannelFileCount(channelId, filters, client) {
- let whereConditions = ['fel.entity_type = \'channel\'', 'fel.entity_id = $1', 'f.deleted_at IS NULL'];
- let params = [channelId];
- let paramIndex = 2;
- // Add filters
- if (filters?.fileType) {
- whereConditions.push(`f.mime_type LIKE $${paramIndex}`);
- params.push(`${filters.fileType}%`);
- paramIndex++;
- }
- if (filters?.uploadedBy) {
- whereConditions.push(`f.uploaded_by = $${paramIndex}`);
- params.push(filters.uploadedBy);
- paramIndex++;
- }
- if (filters?.search) {
- whereConditions.push(`(
- LOWER(f.filename) LIKE LOWER($${paramIndex}) OR
- LOWER(f.original_name) LIKE LOWER($${paramIndex})
- )`);
- params.push(`%${filters.search}%`);
- paramIndex++;
- }
- if (filters?.after) {
- whereConditions.push(`f.uploaded_at > $${paramIndex}`);
- params.push(filters.after);
- paramIndex++;
- }
- if (filters?.before) {
- whereConditions.push(`f.uploaded_at < $${paramIndex}`);
- params.push(filters.before);
- paramIndex++;
- }
- const sql = `
- SELECT COUNT(*) as count
- FROM ${this.tableName} f
- INNER JOIN file_entity_links fel ON f.id = fel.file_id
- WHERE ${whereConditions.join(' AND ')}
- `;
- const result = await this.executeRawQuery(sql, params, client);
- return parseInt(result.rows[0]?.count || '0', 10);
- }
- /**
- * Find files by task
- */
- async findTaskFiles(taskId, limit = 50, offset = 0, client) {
- const sql = `
- SELECT
- f.*,
- u.name as uploader_name,
- u.email as uploader_email,
- u.avatar_url as uploader_avatar,
- t.title as task_title
- FROM ${this.tableName} f
- LEFT JOIN users u ON f.uploaded_by = u.id
- LEFT JOIN tasks t ON f.task_id = t.id
- WHERE f.task_id = $1 AND f.deleted_at IS NULL
- ORDER BY f.created_at DESC
- LIMIT $2 OFFSET $3
- `;
- const result = await this.executeRawQuery(sql, [taskId, limit, offset], client);
- return result.rows;
- }
- /**
- * Find files by user
- */
- async findUserFiles(userId, filters, limit = 50, offset = 0, client) {
- let whereConditions = ['f.uploaded_by = $1', 'f.deleted_at IS NULL'];
- let params = [userId];
- let paramIndex = 2;
- // Add filters
- if (filters?.channelId) {
- whereConditions.push(`f.channel_id = $${paramIndex}`);
- params.push(filters.channelId);
- paramIndex++;
- }
- if (filters?.taskId) {
- whereConditions.push(`f.task_id = $${paramIndex}`);
- params.push(filters.taskId);
- paramIndex++;
- }
- if (filters?.fileType) {
- whereConditions.push(`f.mime_type LIKE $${paramIndex}`);
- params.push(`${filters.fileType}%`);
- paramIndex++;
- }
- const sql = `
- SELECT
- f.*,
- u.name as uploader_name,
- u.email as uploader_email,
- u.avatar_url as uploader_avatar,
- c.name as channel_name,
- t.title as task_title
- FROM ${this.tableName} f
- LEFT JOIN users u ON f.uploaded_by = u.id
- LEFT JOIN channels c ON f.channel_id = c.id
- LEFT JOIN tasks t ON f.task_id = t.id
- WHERE ${whereConditions.join(' AND ')}
- ORDER BY f.created_at DESC
- LIMIT $${paramIndex} OFFSET $${paramIndex + 1}
- `;
- params.push(limit, offset);
- const result = await this.executeRawQuery(sql, params, client);
- return result.rows;
- }
- /**
- * Search files by name or content
- */
- async searchFiles(searchTerm, options, limit = 50, offset = 0, client) {
- let whereConditions = [
- 'f.deleted_at IS NULL',
- '(LOWER(f.filename) LIKE LOWER($1) OR LOWER(f.original_name) LIKE LOWER($1))',
- ];
- let params = [`%${searchTerm}%`];
- let paramIndex = 2;
- // Add filters
- if (options?.userId) {
- whereConditions.push(`f.uploaded_by = $${paramIndex}`);
- params.push(options.userId);
- paramIndex++;
- }
- if (options?.channelId) {
- whereConditions.push(`f.channel_id = $${paramIndex}`);
- params.push(options.channelId);
- paramIndex++;
- }
- if (options?.taskId) {
- whereConditions.push(`f.task_id = $${paramIndex}`);
- params.push(options.taskId);
- paramIndex++;
- }
- if (options?.fileType) {
- whereConditions.push(`f.mime_type LIKE $${paramIndex}`);
- params.push(`${options.fileType}%`);
- paramIndex++;
- }
- const sql = `
- SELECT
- f.*,
- u.name as uploader_name,
- u.email as uploader_email,
- u.avatar_url as uploader_avatar,
- c.name as channel_name,
- t.title as task_title
- FROM ${this.tableName} f
- LEFT JOIN users u ON f.uploaded_by = u.id
- LEFT JOIN channels c ON f.channel_id = c.id
- LEFT JOIN tasks t ON f.task_id = t.id
- WHERE ${whereConditions.join(' AND ')}
- ORDER BY f.created_at DESC
- LIMIT $${paramIndex} OFFSET $${paramIndex + 1}
- `;
- params.push(limit, offset);
- const result = await this.executeRawQuery(sql, params, client);
- return result.rows;
- }
- /**
- * Update file access tracking
- */
- async recordFileAccess(fileId, client) {
- const sql = `
- UPDATE ${this.tableName}
- SET
- access_count = access_count + 1,
- last_accessed_at = NOW()
- WHERE id = $1 AND deleted_at IS NULL
- `;
- try {
- await this.executeRawQuery(sql, [fileId], client);
- logger_1.logger.debug({
- fileId,
- }, 'File access recorded');
- }
- catch (error) {
- logger_1.logger.error({ error, fileId }, 'Failed to record file access');
- }
- }
- /**
- * Update file download count
- */
- async recordFileDownload(fileId, client) {
- const sql = `
- UPDATE ${this.tableName}
- SET download_count = download_count + 1
- WHERE id = $1 AND deleted_at IS NULL
- `;
- try {
- await this.executeRawQuery(sql, [fileId], client);
- logger_1.logger.debug({
- fileId,
- }, 'File download recorded');
- }
- catch (error) {
- logger_1.logger.error({ error, fileId }, 'Failed to record file download');
- }
- }
- /**
- * Update virus scan status
- */
- async updateVirusScanStatus(fileId, status, result, client) {
- const sql = `
- UPDATE ${this.tableName}
- SET
- virus_scan_status = $2,
- virus_scan_result = $3
- WHERE id = $1 AND deleted_at IS NULL
- RETURNING id
- `;
- try {
- const queryResult = await this.executeRawQuery(sql, [fileId, status, JSON.stringify(result || {})], client);
- if (queryResult.rowCount > 0) {
- logger_1.logger.info({
- fileId,
- status,
- hasResult: !!result,
- }, 'Virus scan status updated');
- return true;
- }
- return false;
- }
- catch (error) {
- logger_1.logger.error({ error, fileId, status }, 'Failed to update virus scan status');
- return false;
- }
- }
- /**
- * Get file statistics
- */
- async getFileStats(client) {
- const statsSql = `
- SELECT
- COUNT(*) as total_files,
- SUM(size) as total_size,
- COUNT(*) FILTER (WHERE mime_type LIKE 'image/%') as image_files,
- COUNT(*) FILTER (WHERE mime_type LIKE 'video/%') as video_files,
- COUNT(*) FILTER (WHERE mime_type LIKE 'audio/%') as audio_files,
- COUNT(*) FILTER (WHERE mime_type = 'application/pdf') as pdf_files,
- COUNT(*) FILTER (WHERE storage_provider = 'local') as local_files,
- COUNT(*) FILTER (WHERE storage_provider = 'aws_s3') as s3_files,
- COUNT(*) FILTER (WHERE virus_scan_status = 'clean') as clean_files,
- COUNT(*) FILTER (WHERE virus_scan_status = 'infected') as infected_files
- FROM ${this.tableName}
- WHERE deleted_at IS NULL
- `;
- const topFilesSql = `
- SELECT id, filename, download_count
- FROM ${this.tableName}
- WHERE deleted_at IS NULL
- AND download_count > 0
- ORDER BY download_count DESC
- LIMIT 10
- `;
- const [statsResult, topFilesResult] = await Promise.all([
- this.executeRawQuery(statsSql, [], client),
- this.executeRawQuery(topFilesSql, [], client),
- ]);
- const stats = statsResult.rows[0];
- return {
- totalFiles: parseInt(stats.total_files, 10),
- totalSize: parseInt(stats.total_size, 10) || 0,
- filesByType: {
- image: parseInt(stats.image_files, 10),
- video: parseInt(stats.video_files, 10),
- audio: parseInt(stats.audio_files, 10),
- pdf: parseInt(stats.pdf_files, 10),
- },
- filesByProvider: {
- local: parseInt(stats.local_files, 10),
- aws_s3: parseInt(stats.s3_files, 10),
- },
- virusScannedFiles: parseInt(stats.clean_files, 10),
- infectedFiles: parseInt(stats.infected_files, 10),
- mostDownloadedFiles: topFilesResult.rows.map((row) => ({
- id: row.id,
- filename: row.filename,
- downloadCount: parseInt(row.download_count, 10),
- })),
- };
- }
- /**
- * Clean up expired files
- */
- async cleanupExpiredFiles(client) {
- const sql = `
- UPDATE ${this.tableName}
- SET deleted_at = NOW()
- WHERE expires_at IS NOT NULL
- AND expires_at < NOW()
- AND deleted_at IS NULL
- `;
- try {
- const result = await this.executeRawQuery(sql, [], client);
- logger_1.logger.info({
- deletedCount: result.rowCount,
- }, 'Expired files cleaned up');
- return result.rowCount;
- }
- catch (error) {
- logger_1.logger.error({ error }, 'Failed to clean up expired files');
- return 0;
- }
- }
- /**
- * Get allowed mime types
- */
- getAllowedMimeTypes() {
- return [
- // Images
- 'image/jpeg',
- 'image/png',
- 'image/gif',
- 'image/webp',
- 'image/svg+xml',
- 'image/bmp',
- 'image/tiff',
- // Documents
- 'application/pdf',
- 'application/msword',
- 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
- 'application/vnd.ms-excel',
- 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
- 'application/vnd.ms-powerpoint',
- 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
- 'text/plain',
- 'text/csv',
- 'text/markdown',
- 'application/json',
- 'application/xml',
- // Archives
- 'application/zip',
- 'application/x-rar-compressed',
- 'application/x-7z-compressed',
- 'application/x-tar',
- 'application/gzip',
- // Media
- 'video/mp4',
- 'video/mpeg',
- 'video/quicktime',
- 'video/webm',
- 'audio/mpeg',
- 'audio/wav',
- 'audio/mp4',
- 'audio/webm',
- 'audio/ogg',
- // Code files
- 'text/javascript',
- 'text/css',
- 'text/html',
- 'application/javascript',
- ];
- }
- /**
- * Check if mime type is allowed
- */
- isMimeTypeAllowed(mimeType) {
- return this.getAllowedMimeTypes().includes(mimeType);
- }
- /**
- * Get file category from mime type
- */
- getFileCategory(mimeType) {
- if (mimeType.startsWith('image/'))
- return 'image';
- if (mimeType.startsWith('video/'))
- return 'video';
- if (mimeType.startsWith('audio/'))
- return 'audio';
- if (mimeType === 'application/pdf')
- return 'document';
- if (mimeType.includes('word') || mimeType.includes('excel') || mimeType.includes('powerpoint'))
- return 'office';
- if (mimeType.startsWith('text/') || mimeType.includes('json') || mimeType.includes('xml'))
- return 'text';
- if (mimeType.includes('zip') || mimeType.includes('rar') || mimeType.includes('tar'))
- return 'archive';
- return 'other';
- }
-}
-exports.default = FileRepository;
-//# sourceMappingURL=FileRepository.js.map
\ No newline at end of file
diff --git a/backend/dist/db/FileRepository.js.map b/backend/dist/db/FileRepository.js.map
deleted file mode 100644
index a74c9b5..0000000
--- a/backend/dist/db/FileRepository.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"FileRepository.js","sourceRoot":"","sources":["../../src/db/FileRepository.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/db/MessageRepository.d.ts b/backend/dist/db/MessageRepository.d.ts
deleted file mode 100644
index ef2c5ec..0000000
--- a/backend/dist/db/MessageRepository.d.ts
+++ /dev/null
@@ -1,139 +0,0 @@
-import { DatabaseClient } from '@config/database';
-import BaseRepository, { BaseEntity } from './BaseRepository';
-export interface Message extends BaseEntity {
- channel_id: string;
- task_id?: string;
- user_id: string;
- content: string;
- message_type: 'text' | 'voice' | 'file' | 'system' | 'command_result' | 'ai_response';
- voice_data?: Record;
- transcription?: string;
- attachments: any[];
- reply_to?: string;
- thread_root?: string;
- is_edited: boolean;
- is_pinned: boolean;
- is_announcement: boolean;
- reactions: Record;
- mentions: string[];
- ai_generated: boolean;
- ai_context?: Record;
- command_execution_id?: string;
- metadata: Record;
- formatting: Record;
- edited_at?: Date;
- user_name?: string;
- user_avatar?: string;
-}
-export interface CreateMessageData {
- channel_id: string;
- task_id?: string;
- user_id: string;
- content: string;
- message_type?: Message['message_type'];
- voice_data?: Record;
- transcription?: string;
- attachments?: any[];
- reply_to?: string;
- thread_root?: string;
- mentions?: string[];
- ai_generated?: boolean;
- ai_context?: Record;
- command_execution_id?: string;
- metadata?: Record;
- formatting?: Record;
-}
-export interface MessageWithUser extends Message {
- user_name: string;
- user_email: string;
- user_avatar?: string;
- user_role: string;
- reply_count?: number;
- last_reply_timestamp?: Date;
- deleted_by_name?: string;
-}
-declare class MessageRepository extends BaseRepository {
- constructor();
- /**
- * Create new message with validation
- */
- createMessage(messageData: CreateMessageData, client?: DatabaseClient): Promise;
- /**
- * Find messages in a channel
- */
- findChannelMessages(channelId: string, filters?: {
- threadRoot?: string;
- messageType?: string;
- before?: Date;
- after?: Date;
- includeThreadReplies?: boolean;
- }, limit?: number, offset?: number, client?: DatabaseClient): Promise;
- /**
- * Get channel message count
- */
- getChannelMessageCount(channelId: string, filters?: {
- threadRoot?: string;
- messageType?: string;
- before?: Date;
- after?: Date;
- includeThreadReplies?: boolean;
- }, client?: DatabaseClient): Promise;
- /**
- * Search messages in channel
- */
- searchMessages(channelId: string, searchTerm: string, limit?: number, offset?: number, client?: DatabaseClient): Promise;
- /**
- * Update message content
- */
- updateMessage(messageId: string, updateData: Partial, client?: DatabaseClient): Promise;
- /**
- * Add reaction to message
- */
- addReaction(messageId: string, userId: string, emoji: string, client?: DatabaseClient): Promise;
- /**
- * Remove reaction from message
- */
- removeReaction(messageId: string, userId: string, emoji: string, client?: DatabaseClient): Promise;
- /**
- * Get message reactions
- */
- getMessageReactions(messageId: string, client?: DatabaseClient): Promise>;
- /**
- * Update user's last read message in channel
- */
- updateLastRead(channelId: string, userId: string, messageId?: string, client?: DatabaseClient): Promise;
- /**
- * Get latest message ID in channel
- */
- private getLatestMessageId;
- /**
- * Get unread message count for user in channel
- */
- getUnreadCount(channelId: string, userId: string, client?: DatabaseClient): Promise;
- /**
- * Get message thread
- */
- getMessageThread(threadRootId: string, limit?: number, offset?: number, client?: DatabaseClient): Promise;
- /**
- * Get pinned messages in channel
- */
- getPinnedMessages(channelId: string, limit?: number, client?: DatabaseClient): Promise;
- /**
- * Get channel message statistics
- */
- getChannelMessageStats(channelId: string, client?: DatabaseClient): Promise<{
- totalMessages: number;
- messagesByType: Record;
- topUsers: Array<{
- userId: string;
- userName: string;
- messageCount: number;
- }>;
- dailyActivity: Array<{
- date: string;
- messageCount: number;
- }>;
- }>;
-}
-export default MessageRepository;
-//# sourceMappingURL=MessageRepository.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/db/MessageRepository.d.ts.map b/backend/dist/db/MessageRepository.d.ts.map
deleted file mode 100644
index 6d90f4e..0000000
--- a/backend/dist/db/MessageRepository.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"MessageRepository.d.ts","sourceRoot":"","sources":["../../src/db/MessageRepository.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/db/MessageRepository.js b/backend/dist/db/MessageRepository.js
deleted file mode 100644
index 5eab2d6..0000000
--- a/backend/dist/db/MessageRepository.js
+++ /dev/null
@@ -1,444 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const logger_1 = require("@utils/logger");
-const BaseRepository_1 = __importDefault(require("./BaseRepository"));
-class MessageRepository extends BaseRepository_1.default {
- constructor() {
- super('messages');
- }
- /**
- * Create new message with validation
- */
- async createMessage(messageData, client) {
- // Set defaults
- const messageToCreate = {
- ...messageData,
- message_type: messageData.message_type || 'text',
- attachments: messageData.attachments || [],
- mentions: messageData.mentions || [],
- metadata: messageData.metadata || {},
- formatting: messageData.formatting || {},
- reactions: {},
- is_edited: false,
- is_pinned: false,
- is_announcement: false,
- ai_generated: messageData.ai_generated || false,
- };
- const message = await this.create(messageToCreate, client);
- logger_1.logger.info({
- messageId: message.id,
- channelId: message.channel_id,
- userId: message.user_id,
- messageType: message.message_type,
- contentLength: message.content.length,
- }, 'Message created successfully');
- return message;
- }
- /**
- * Find messages in a channel
- */
- async findChannelMessages(channelId, filters, limit = 50, offset = 0, client) {
- let whereConditions = ['m.channel_id = $1', 'm.deleted_at IS NULL'];
- let params = [channelId];
- let paramIndex = 2;
- // Add filters
- if (filters?.threadRoot) {
- whereConditions.push(`m.thread_root = $${paramIndex}`);
- params.push(filters.threadRoot);
- paramIndex++;
- }
- else if (!filters?.includeThreadReplies) {
- // For main channel messages, exclude thread replies (messages with thread_root)
- // unless explicitly requested to include them
- whereConditions.push(`m.thread_root IS NULL`);
- }
- if (filters?.messageType) {
- whereConditions.push(`m.message_type = $${paramIndex}`);
- params.push(filters.messageType);
- paramIndex++;
- }
- if (filters?.before) {
- whereConditions.push(`m.created_at < $${paramIndex}`);
- params.push(filters.before);
- paramIndex++;
- }
- if (filters?.after) {
- whereConditions.push(`m.created_at > $${paramIndex}`);
- params.push(filters.after);
- paramIndex++;
- }
- const sql = `
- SELECT
- m.*,
- u.name as user_name,
- u.email as user_email,
- u.avatar_url as user_avatar,
- u.role as user_role,
- COALESCE(thread_stats.reply_count, 0) as reply_count,
- thread_stats.last_reply_timestamp,
- deleter.name as deleted_by_name
- FROM ${this.tableName} m
- LEFT JOIN users u ON m.user_id = u.id
- LEFT JOIN users deleter ON m.deleted_by = deleter.id
- LEFT JOIN (
- SELECT
- thread_root,
- COUNT(*) as reply_count,
- MAX(created_at) as last_reply_timestamp
- FROM ${this.tableName}
- WHERE thread_root IS NOT NULL
- AND deleted_at IS NULL
- GROUP BY thread_root
- ) thread_stats ON m.id = thread_stats.thread_root
- WHERE ${whereConditions.join(' AND ')}
- ORDER BY m.created_at DESC
- LIMIT $${paramIndex} OFFSET $${paramIndex + 1}
- `;
- params.push(limit, offset);
- const result = await this.executeRawQuery(sql, params, client);
- return result.rows;
- }
- /**
- * Get channel message count
- */
- async getChannelMessageCount(channelId, filters, client) {
- let whereConditions = ['channel_id = $1', 'deleted_at IS NULL'];
- let params = [channelId];
- let paramIndex = 2;
- // Add filters
- if (filters?.threadRoot) {
- whereConditions.push(`thread_root = $${paramIndex}`);
- params.push(filters.threadRoot);
- paramIndex++;
- }
- else if (!filters?.includeThreadReplies) {
- // For main channel messages, exclude thread replies (messages with thread_root)
- // unless explicitly requested to include them
- whereConditions.push(`thread_root IS NULL`);
- }
- if (filters?.messageType) {
- whereConditions.push(`message_type = $${paramIndex}`);
- params.push(filters.messageType);
- paramIndex++;
- }
- if (filters?.before) {
- whereConditions.push(`created_at < $${paramIndex}`);
- params.push(filters.before);
- paramIndex++;
- }
- if (filters?.after) {
- whereConditions.push(`created_at > $${paramIndex}`);
- params.push(filters.after);
- paramIndex++;
- }
- const sql = `
- SELECT COUNT(*) as count
- FROM ${this.tableName}
- WHERE ${whereConditions.join(' AND ')}
- `;
- const result = await this.executeRawQuery(sql, params, client);
- return parseInt(result.rows[0]?.count || '0', 10);
- }
- /**
- * Search messages in channel
- */
- async searchMessages(channelId, searchTerm, limit = 50, offset = 0, client) {
- const sql = `
- SELECT
- m.*,
- u.name as user_name,
- u.email as user_email,
- u.avatar_url as user_avatar,
- u.role as user_role,
- deleter.name as deleted_by_name
- FROM ${this.tableName} m
- LEFT JOIN users u ON m.user_id = u.id
- LEFT JOIN users deleter ON m.deleted_by = deleter.id
- WHERE m.channel_id = $1
- AND m.deleted_at IS NULL
- AND (
- LOWER(m.content) LIKE LOWER($2)
- OR LOWER(m.transcription) LIKE LOWER($2)
- )
- ORDER BY m.created_at DESC
- LIMIT $3 OFFSET $4
- `;
- const result = await this.executeRawQuery(sql, [channelId, `%${searchTerm}%`, limit, offset], client);
- return result.rows;
- }
- /**
- * Update message content
- */
- async updateMessage(messageId, updateData, client) {
- const message = await this.update(messageId, updateData, client);
- if (message) {
- logger_1.logger.info({
- messageId,
- updatedFields: Object.keys(updateData),
- }, 'Message updated successfully');
- }
- return message;
- }
- /**
- * Add reaction to message
- */
- async addReaction(messageId, userId, emoji, client) {
- const sql = `
- UPDATE ${this.tableName}
- SET reactions = COALESCE(reactions, '{}'::jsonb) ||
- jsonb_build_object($2,
- COALESCE((reactions->$2)::jsonb, '[]'::jsonb) ||
- CASE
- WHEN (reactions->$2)::text LIKE '%"' || $3 || '"%'
- THEN '[]'::jsonb
- ELSE jsonb_build_array($3)
- END
- )
- WHERE id = $1 AND deleted_at IS NULL
- RETURNING id
- `;
- try {
- const result = await this.executeRawQuery(sql, [messageId, emoji, userId], client);
- if (result.rowCount > 0) {
- logger_1.logger.info({
- messageId,
- userId,
- emoji,
- }, 'Reaction added to message');
- return true;
- }
- return false;
- }
- catch (error) {
- logger_1.logger.error({ error, messageId, userId, emoji }, 'Failed to add reaction');
- return false;
- }
- }
- /**
- * Remove reaction from message
- */
- async removeReaction(messageId, userId, emoji, client) {
- const sql = `
- UPDATE ${this.tableName}
- SET reactions = COALESCE(reactions, '{}'::jsonb) ||
- jsonb_build_object($2,
- COALESCE(
- (SELECT jsonb_agg(elem)
- FROM jsonb_array_elements_text((reactions->$2)::jsonb) AS elem
- WHERE elem != $3),
- '[]'::jsonb
- )
- )
- WHERE id = $1 AND deleted_at IS NULL
- RETURNING id
- `;
- try {
- const result = await this.executeRawQuery(sql, [messageId, emoji, userId], client);
- if (result.rowCount > 0) {
- logger_1.logger.info({
- messageId,
- userId,
- emoji,
- }, 'Reaction removed from message');
- return true;
- }
- return false;
- }
- catch (error) {
- logger_1.logger.error({ error, messageId, userId, emoji }, 'Failed to remove reaction');
- return false;
- }
- }
- /**
- * Get message reactions
- */
- async getMessageReactions(messageId, client) {
- const sql = `
- SELECT reactions
- FROM ${this.tableName}
- WHERE id = $1 AND deleted_at IS NULL
- `;
- const result = await this.executeRawQuery(sql, [messageId], client);
- return result.rows[0]?.reactions || {};
- }
- /**
- * Update user's last read message in channel
- */
- async updateLastRead(channelId, userId, messageId, client) {
- // If no messageId provided, use the latest message
- const latestMessageId = messageId || await this.getLatestMessageId(channelId, client);
- if (!latestMessageId)
- return;
- const sql = `
- INSERT INTO channel_read_status (channel_id, user_id, last_read_message_id, last_read_at)
- VALUES ($1, $2, $3, NOW())
- ON CONFLICT (channel_id, user_id)
- DO UPDATE SET
- last_read_message_id = EXCLUDED.last_read_message_id,
- last_read_at = EXCLUDED.last_read_at
- `;
- try {
- await this.executeRawQuery(sql, [channelId, userId, latestMessageId], client);
- logger_1.logger.debug({
- channelId,
- userId,
- messageId: latestMessageId,
- }, 'Last read message updated');
- }
- catch (error) {
- logger_1.logger.error({ error, channelId, userId }, 'Failed to update last read');
- }
- }
- /**
- * Get latest message ID in channel
- */
- async getLatestMessageId(channelId, client) {
- const sql = `
- SELECT id
- FROM ${this.tableName}
- WHERE channel_id = $1 AND deleted_at IS NULL
- ORDER BY created_at DESC
- LIMIT 1
- `;
- const result = await this.executeRawQuery(sql, [channelId], client);
- return result.rows[0]?.id || null;
- }
- /**
- * Get unread message count for user in channel
- */
- async getUnreadCount(channelId, userId, client) {
- const sql = `
- WITH last_read AS (
- SELECT last_read_message_id, last_read_at
- FROM channel_read_status
- WHERE channel_id = $1 AND user_id = $2
- )
- SELECT COUNT(*) as count
- FROM ${this.tableName} m
- LEFT JOIN last_read lr ON true
- WHERE m.channel_id = $1
- AND m.deleted_at IS NULL
- AND m.user_id != $2
- AND (
- lr.last_read_message_id IS NULL
- OR m.created_at > lr.last_read_at
- )
- `;
- const result = await this.executeRawQuery(sql, [channelId, userId], client);
- return parseInt(result.rows[0]?.count || '0', 10);
- }
- /**
- * Get message thread
- */
- async getMessageThread(threadRootId, limit = 50, offset = 0, client) {
- const sql = `
- SELECT
- m.*,
- u.name as user_name,
- u.email as user_email,
- u.avatar_url as user_avatar,
- u.role as user_role,
- deleter.name as deleted_by_name
- FROM ${this.tableName} m
- LEFT JOIN users u ON m.user_id = u.id
- LEFT JOIN users deleter ON m.deleted_by = deleter.id
- WHERE (m.id = $1 OR m.thread_root = $1)
- AND m.deleted_at IS NULL
- ORDER BY m.created_at ASC
- LIMIT $2 OFFSET $3
- `;
- const result = await this.executeRawQuery(sql, [threadRootId, limit, offset], client);
- return result.rows;
- }
- /**
- * Get pinned messages in channel
- */
- async getPinnedMessages(channelId, limit = 20, client) {
- const sql = `
- SELECT
- m.*,
- u.name as user_name,
- u.email as user_email,
- u.avatar_url as user_avatar,
- u.role as user_role,
- deleter.name as deleted_by_name
- FROM ${this.tableName} m
- LEFT JOIN users u ON m.user_id = u.id
- LEFT JOIN users deleter ON m.deleted_by = deleter.id
- WHERE m.channel_id = $1
- AND m.is_pinned = true
- AND m.deleted_at IS NULL
- ORDER BY m.created_at DESC
- LIMIT $2
- `;
- const result = await this.executeRawQuery(sql, [channelId, limit], client);
- return result.rows;
- }
- /**
- * Get channel message statistics
- */
- async getChannelMessageStats(channelId, client) {
- const statsSql = `
- SELECT
- COUNT(*) as total_messages,
- COUNT(*) FILTER (WHERE message_type = 'text') as text_messages,
- COUNT(*) FILTER (WHERE message_type = 'voice') as voice_messages,
- COUNT(*) FILTER (WHERE message_type = 'file') as file_messages,
- COUNT(*) FILTER (WHERE message_type = 'system') as system_messages
- FROM ${this.tableName}
- WHERE channel_id = $1 AND deleted_at IS NULL
- `;
- const topUsersSql = `
- SELECT
- m.user_id,
- u.name as user_name,
- COUNT(*) as message_count
- FROM ${this.tableName} m
- LEFT JOIN users u ON m.user_id = u.id
- WHERE m.channel_id = $1 AND m.deleted_at IS NULL
- GROUP BY m.user_id, u.name
- ORDER BY message_count DESC
- LIMIT 10
- `;
- const dailyActivitySql = `
- SELECT
- DATE(created_at) as date,
- COUNT(*) as message_count
- FROM ${this.tableName}
- WHERE channel_id = $1
- AND deleted_at IS NULL
- AND created_at >= NOW() - INTERVAL '30 days'
- GROUP BY DATE(created_at)
- ORDER BY date DESC
- `;
- const [statsResult, topUsersResult, dailyActivityResult] = await Promise.all([
- this.executeRawQuery(statsSql, [channelId], client),
- this.executeRawQuery(topUsersSql, [channelId], client),
- this.executeRawQuery(dailyActivitySql, [channelId], client),
- ]);
- const stats = statsResult.rows[0];
- return {
- totalMessages: parseInt(stats.total_messages, 10),
- messagesByType: {
- text: parseInt(stats.text_messages, 10),
- voice: parseInt(stats.voice_messages, 10),
- file: parseInt(stats.file_messages, 10),
- system: parseInt(stats.system_messages, 10),
- },
- topUsers: topUsersResult.rows.map((row) => ({
- userId: row.user_id,
- userName: row.user_name,
- messageCount: parseInt(row.message_count, 10),
- })),
- dailyActivity: dailyActivityResult.rows.map((row) => ({
- date: row.date,
- messageCount: parseInt(row.message_count, 10),
- })),
- };
- }
-}
-exports.default = MessageRepository;
-//# sourceMappingURL=MessageRepository.js.map
\ No newline at end of file
diff --git a/backend/dist/db/MessageRepository.js.map b/backend/dist/db/MessageRepository.js.map
deleted file mode 100644
index b02eb29..0000000
--- a/backend/dist/db/MessageRepository.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"MessageRepository.js","sourceRoot":"","sources":["../../src/db/MessageRepository.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/db/TaskRepository.d.ts b/backend/dist/db/TaskRepository.d.ts
deleted file mode 100644
index 05d51ac..0000000
--- a/backend/dist/db/TaskRepository.d.ts
+++ /dev/null
@@ -1,169 +0,0 @@
-import { DatabaseClient } from '@config/database';
-import BaseRepository, { BaseEntity } from './BaseRepository';
-export interface Task extends BaseEntity {
- title: string;
- description?: string;
- channel_id?: string;
- parent_task_id?: string;
- created_by: string;
- assigned_to: string[];
- owned_by?: string;
- priority: 'low' | 'medium' | 'high' | 'urgent' | 'critical';
- status: 'pending' | 'in_progress' | 'review' | 'completed' | 'cancelled' | 'on_hold';
- task_type: 'general' | 'project' | 'maintenance' | 'emergency' | 'research' | 'approval';
- complexity: number;
- estimated_hours?: number;
- actual_hours: number;
- story_points?: number;
- due_date?: Date;
- start_date?: Date;
- completed_at?: Date;
- progress_percentage: number;
- tags: string[];
- labels: Record;
- custom_fields: Record;
- voice_created: boolean;
- voice_command_id?: string;
- voice_instructions?: string;
- ai_generated: boolean;
- ai_suggestions: Record;
- automation_rules: Record;
- watchers: string[];
- comments_count: number;
- attachments_count: number;
- business_value: 'low' | 'medium' | 'high' | 'critical';
- cost_center?: string;
- budget_impact?: number;
- acceptance_criteria?: string;
- definition_of_done?: string;
- quality_score?: number;
- external_references: Record;
- integrations: Record;
- recurrence_pattern?: Record;
- recurrence_parent_id?: string;
- is_recurring: boolean;
- last_activity_at: Date;
-}
-export interface CreateTaskData {
- title: string;
- description?: string;
- channel_id?: string;
- parent_task_id?: string;
- created_by: string;
- assigned_to?: string[];
- owned_by?: string;
- priority?: Task['priority'];
- task_type?: Task['task_type'];
- complexity?: number;
- estimated_hours?: number;
- due_date?: Date;
- start_date?: Date;
- tags?: string[];
- labels?: Record;
- voice_created?: boolean;
- voice_command_id?: string;
- voice_instructions?: string;
- business_value?: Task['business_value'];
- acceptance_criteria?: string;
-}
-export interface TaskWithDetails extends Task {
- channel_name?: string;
- owner_name?: string;
- assignee_details?: Array<{
- id: string;
- name: string;
- email: string;
- avatar_url?: string;
- }>;
- subtask_count?: number;
- dependency_count?: number;
-}
-export interface TaskFilter {
- status?: Task['status'][];
- priority?: Task['priority'][];
- assignedTo?: string[];
- channelId?: string;
- dueAfter?: Date;
- dueBefore?: Date;
- tags?: string[];
- voiceCreated?: boolean;
- overdue?: boolean;
-}
-declare class TaskRepository extends BaseRepository {
- constructor();
- /**
- * Create new task with validation
- */
- createTask(taskData: CreateTaskData, client?: DatabaseClient): Promise;
- /**
- * Assign users to task
- */
- assignUsers(taskId: string, userIds: string[], assignedBy: string, client?: DatabaseClient): Promise;
- /**
- * Unassign users from task
- */
- unassignUsers(taskId: string, userIds: string[], unassignedBy: string, client?: DatabaseClient): Promise;
- /**
- * Find tasks assigned to user
- */
- findByAssignee(userId: string, status?: Task['status'][], includeWatching?: boolean, client?: DatabaseClient): Promise;
- /**
- * Find tasks in channel
- */
- findByChannel(channelId: string, includeCompleted?: boolean, client?: DatabaseClient): Promise;
- /**
- * Find overdue tasks
- */
- findOverdue(userId?: string, client?: DatabaseClient): Promise;
- /**
- * Find tasks with filters
- */
- findWithFilters(filters: TaskFilter, limit?: number, offset?: number, client?: DatabaseClient): Promise;
- /**
- * Update task progress
- */
- updateProgress(taskId: string, progressPercentage: number, updatedBy: string, client?: DatabaseClient): Promise;
- /**
- * Update task status
- */
- updateStatus(taskId: string, status: Task['status'], updatedBy: string, client?: DatabaseClient): Promise;
- /**
- * Get task with details (channel, assignees, subtasks)
- */
- findWithDetails(taskId: string, client?: DatabaseClient): Promise;
- /**
- * Get task hierarchy (parent and children)
- */
- getTaskHierarchy(taskId: string, client?: DatabaseClient): Promise>;
- /**
- * Search tasks by title or description
- */
- searchTasks(searchTerm: string, userId?: string, limit?: number, offset?: number, client?: DatabaseClient): Promise;
- /**
- * Get task statistics
- */
- getTaskStats(userId?: string, client?: DatabaseClient): Promise<{
- totalTasks: number;
- tasksByStatus: Record;
- tasksByPriority: Record;
- overdueTasks: number;
- completedThisWeek: number;
- averageCompletionTime: number;
- }>;
- /**
- * Add watcher to task
- */
- addWatcher(taskId: string, userId: string, client?: DatabaseClient): Promise;
- /**
- * Remove watcher from task
- */
- removeWatcher(taskId: string, userId: string, client?: DatabaseClient): Promise;
-}
-export default TaskRepository;
-//# sourceMappingURL=TaskRepository.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/db/TaskRepository.d.ts.map b/backend/dist/db/TaskRepository.d.ts.map
deleted file mode 100644
index 6e73cc3..0000000
--- a/backend/dist/db/TaskRepository.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"TaskRepository.d.ts","sourceRoot":"","sources":["../../src/db/TaskRepository.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/db/TaskRepository.js b/backend/dist/db/TaskRepository.js
deleted file mode 100644
index ba434d5..0000000
--- a/backend/dist/db/TaskRepository.js
+++ /dev/null
@@ -1,460 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const logger_1 = require("@utils/logger");
-const errors_1 = require("@utils/errors");
-const BaseRepository_1 = __importDefault(require("./BaseRepository"));
-class TaskRepository extends BaseRepository_1.default {
- constructor() {
- super('tasks');
- }
- /**
- * Create new task with validation
- */
- async createTask(taskData, client) {
- // Validate parent task if specified
- if (taskData.parent_task_id) {
- const parentTask = await this.findById(taskData.parent_task_id, false, client);
- if (!parentTask) {
- throw new errors_1.ValidationError('Parent task not found', [
- { field: 'parent_task_id', message: 'Parent task does not exist', value: taskData.parent_task_id }
- ]);
- }
- }
- // Set defaults
- const taskToCreate = {
- ...taskData,
- assigned_to: taskData.assigned_to || [taskData.created_by],
- owned_by: taskData.owned_by || taskData.assigned_to?.[0] || taskData.created_by,
- priority: taskData.priority || 'medium',
- status: 'pending',
- task_type: taskData.task_type || 'general',
- complexity: taskData.complexity || 1,
- actual_hours: 0,
- progress_percentage: 0,
- tags: taskData.tags || [],
- labels: taskData.labels || {},
- custom_fields: {},
- voice_created: taskData.voice_created || false,
- ai_generated: false,
- ai_suggestions: {},
- automation_rules: {},
- watchers: [],
- comments_count: 0,
- attachments_count: 0,
- business_value: taskData.business_value || 'medium',
- external_references: {},
- integrations: {
- calendar_event: null,
- email_thread: null,
- document_links: [],
- meeting_recordings: []
- },
- is_recurring: false,
- last_activity_at: new Date()
- };
- const task = await this.create(taskToCreate, client);
- logger_1.logger.info({
- taskId: task.id,
- title: task.title,
- createdBy: task.created_by,
- assignedTo: task.assigned_to,
- channelId: task.channel_id
- }, 'Task created successfully');
- return task;
- }
- /**
- * Assign users to task
- */
- async assignUsers(taskId, userIds, assignedBy, client) {
- const sql = `
- SELECT assign_task($1, $2, $3)
- `;
- try {
- const result = await this.executeRawQuery(sql, [taskId, userIds, assignedBy], client);
- const success = result.rows[0]?.assign_task || false;
- if (success) {
- logger_1.logger.info({
- taskId,
- userIds,
- assignedBy
- }, 'Users assigned to task');
- }
- return success;
- }
- catch (error) {
- logger_1.logger.error({ error, taskId, userIds }, 'Failed to assign users to task');
- throw error;
- }
- }
- /**
- * Unassign users from task
- */
- async unassignUsers(taskId, userIds, unassignedBy, client) {
- const sql = `
- SELECT unassign_task($1, $2, $3)
- `;
- try {
- const result = await this.executeRawQuery(sql, [taskId, userIds, unassignedBy], client);
- const success = result.rows[0]?.unassign_task || false;
- if (success) {
- logger_1.logger.info({
- taskId,
- userIds,
- unassignedBy
- }, 'Users unassigned from task');
- }
- return success;
- }
- catch (error) {
- logger_1.logger.error({ error, taskId, userIds }, 'Failed to unassign users from task');
- throw error;
- }
- }
- /**
- * Find tasks assigned to user
- */
- async findByAssignee(userId, status, includeWatching = true, client) {
- const sql = `
- SELECT * FROM get_user_tasks($1, $2, $3)
- `;
- const result = await this.executeRawQuery(sql, [userId, status, includeWatching], client);
- return result.rows;
- }
- /**
- * Find tasks in channel
- */
- async findByChannel(channelId, includeCompleted = true, client) {
- const statusFilter = includeCompleted ? {} : { status: ['pending', 'in_progress', 'review', 'on_hold'] };
- const options = {
- filters: { channel_id: channelId, ...statusFilter },
- orderBy: 'created_at',
- orderDirection: 'DESC'
- };
- const result = await this.findMany(options, client);
- return result.data;
- }
- /**
- * Find overdue tasks
- */
- async findOverdue(userId, client) {
- let sql = `
- SELECT ${this.selectFields.join(', ')}
- FROM ${this.tableName}
- WHERE due_date < NOW()
- AND status NOT IN ('completed', 'cancelled')
- AND deleted_at IS NULL
- `;
- let params = [];
- if (userId) {
- sql += ` AND $1 = ANY(assigned_to)`;
- params = [userId];
- }
- sql += ` ORDER BY due_date ASC`;
- const result = await this.executeRawQuery(sql, params, client);
- return result.rows;
- }
- /**
- * Find tasks with filters
- */
- async findWithFilters(filters, limit = 50, offset = 0, client) {
- const whereConditions = ['deleted_at IS NULL'];
- const params = [];
- let paramCounter = 1;
- // Status filter
- if (filters.status && filters.status.length > 0) {
- whereConditions.push(`status = ANY($${paramCounter})`);
- params.push(filters.status);
- paramCounter++;
- }
- // Priority filter
- if (filters.priority && filters.priority.length > 0) {
- whereConditions.push(`priority = ANY($${paramCounter})`);
- params.push(filters.priority);
- paramCounter++;
- }
- // Assignee filter
- if (filters.assignedTo && filters.assignedTo.length > 0) {
- whereConditions.push(`assigned_to && $${paramCounter}`);
- params.push(filters.assignedTo);
- paramCounter++;
- }
- // Channel filter
- if (filters.channelId) {
- whereConditions.push(`channel_id = $${paramCounter}`);
- params.push(filters.channelId);
- paramCounter++;
- }
- // Due date filters
- if (filters.dueAfter) {
- whereConditions.push(`due_date >= $${paramCounter}`);
- params.push(filters.dueAfter);
- paramCounter++;
- }
- if (filters.dueBefore) {
- whereConditions.push(`due_date <= $${paramCounter}`);
- params.push(filters.dueBefore);
- paramCounter++;
- }
- // Tags filter
- if (filters.tags && filters.tags.length > 0) {
- whereConditions.push(`tags && $${paramCounter}`);
- params.push(filters.tags);
- paramCounter++;
- }
- // Voice created filter
- if (filters.voiceCreated !== undefined) {
- whereConditions.push(`voice_created = $${paramCounter}`);
- params.push(filters.voiceCreated);
- paramCounter++;
- }
- // Overdue filter
- if (filters.overdue) {
- whereConditions.push(`due_date < NOW() AND status NOT IN ('completed', 'cancelled')`);
- }
- const sql = `
- SELECT ${this.selectFields.join(', ')}
- FROM ${this.tableName}
- WHERE ${whereConditions.join(' AND ')}
- ORDER BY
- CASE priority
- WHEN 'critical' THEN 5
- WHEN 'urgent' THEN 4
- WHEN 'high' THEN 3
- WHEN 'medium' THEN 2
- ELSE 1
- END DESC,
- due_date ASC NULLS LAST,
- created_at DESC
- LIMIT $${paramCounter} OFFSET $${paramCounter + 1}
- `;
- params.push(limit, offset);
- const result = await this.executeRawQuery(sql, params, client);
- return result.rows;
- }
- /**
- * Update task progress
- */
- async updateProgress(taskId, progressPercentage, updatedBy, client) {
- if (progressPercentage < 0 || progressPercentage > 100) {
- throw new errors_1.ValidationError('Progress percentage must be between 0 and 100', [
- { field: 'progress_percentage', message: 'Invalid progress value', value: progressPercentage }
- ]);
- }
- const updateData = {
- progress_percentage: progressPercentage,
- last_activity_at: new Date()
- };
- const task = await this.update(taskId, updateData, undefined, client);
- logger_1.logger.info({
- taskId,
- progressPercentage,
- updatedBy
- }, 'Task progress updated');
- return task;
- }
- /**
- * Update task status
- */
- async updateStatus(taskId, status, updatedBy, client) {
- const updateData = {
- status,
- last_activity_at: new Date()
- };
- // Set completion timestamp for completed tasks
- if (status === 'completed') {
- updateData.completed_at = new Date();
- updateData.progress_percentage = 100;
- }
- // Clear completion timestamp when moving away from completed
- const currentTask = await this.findById(taskId, false, client);
- if (currentTask?.status === 'completed' && status !== 'completed') {
- updateData.completed_at = null;
- }
- const task = await this.update(taskId, updateData, undefined, client);
- logger_1.logger.info({
- taskId,
- status,
- updatedBy,
- previousStatus: currentTask?.status
- }, 'Task status updated');
- return task;
- }
- /**
- * Get task with details (channel, assignees, subtasks)
- */
- async findWithDetails(taskId, client) {
- const sql = `
- SELECT
- t.*,
- c.name as channel_name,
- owner.name as owner_name,
- ARRAY(
- SELECT json_build_object(
- 'id', u.id,
- 'name', u.name,
- 'email', u.email,
- 'avatar_url', u.avatar_url
- )
- FROM users u
- WHERE u.id = ANY(t.assigned_to)
- AND u.deleted_at IS NULL
- ORDER BY u.name
- ) as assignee_details,
- (
- SELECT COUNT(*)
- FROM tasks subtasks
- WHERE subtasks.parent_task_id = t.id
- AND subtasks.deleted_at IS NULL
- ) as subtask_count,
- (
- SELECT COUNT(*)
- FROM task_dependencies td
- WHERE td.task_id = t.id
- AND td.deleted_at IS NULL
- AND td.is_active = true
- ) as dependency_count
- FROM tasks t
- LEFT JOIN channels c ON t.channel_id = c.id
- LEFT JOIN users owner ON t.owned_by = owner.id
- WHERE t.id = $1 AND t.deleted_at IS NULL
- `;
- const result = await this.executeRawQuery(sql, [taskId], client);
- return result.rows[0] || null;
- }
- /**
- * Get task hierarchy (parent and children)
- */
- async getTaskHierarchy(taskId, client) {
- const sql = `
- SELECT * FROM get_task_hierarchy($1)
- `;
- const result = await this.executeRawQuery(sql, [taskId], client);
- return result.rows;
- }
- /**
- * Search tasks by title or description
- */
- async searchTasks(searchTerm, userId, limit = 20, offset = 0, client) {
- let userCondition = '';
- let params = [`%${searchTerm}%`, limit, offset];
- if (userId) {
- userCondition = 'AND ($4 = ANY(assigned_to) OR $4 = ANY(watchers) OR created_by = $4)';
- params.push(userId);
- }
- const sql = `
- SELECT ${this.selectFields.join(', ')}
- FROM ${this.tableName}
- WHERE (
- LOWER(title) LIKE LOWER($1) OR
- LOWER(description) LIKE LOWER($1) OR
- LOWER(array_to_string(tags, ' ')) LIKE LOWER($1)
- )
- AND deleted_at IS NULL
- AND status != 'cancelled'
- ${userCondition}
- ORDER BY
- CASE WHEN LOWER(title) LIKE LOWER($1) THEN 1 ELSE 2 END,
- CASE priority
- WHEN 'critical' THEN 5
- WHEN 'urgent' THEN 4
- WHEN 'high' THEN 3
- WHEN 'medium' THEN 2
- ELSE 1
- END DESC,
- created_at DESC
- LIMIT $2 OFFSET $3
- `;
- const result = await this.executeRawQuery(sql, params, client);
- return result.rows;
- }
- /**
- * Get task statistics
- */
- async getTaskStats(userId, client) {
- let userCondition = '';
- let params = [];
- if (userId) {
- userCondition = 'WHERE ($1 = ANY(assigned_to) OR created_by = $1) AND deleted_at IS NULL';
- params = [userId];
- }
- else {
- userCondition = 'WHERE deleted_at IS NULL';
- }
- const sql = `
- SELECT
- COUNT(*) as total_tasks,
- COUNT(*) FILTER (WHERE status = 'pending') as pending_tasks,
- COUNT(*) FILTER (WHERE status = 'in_progress') as in_progress_tasks,
- COUNT(*) FILTER (WHERE status = 'review') as review_tasks,
- COUNT(*) FILTER (WHERE status = 'completed') as completed_tasks,
- COUNT(*) FILTER (WHERE status = 'cancelled') as cancelled_tasks,
- COUNT(*) FILTER (WHERE status = 'on_hold') as on_hold_tasks,
- COUNT(*) FILTER (WHERE priority = 'low') as low_priority,
- COUNT(*) FILTER (WHERE priority = 'medium') as medium_priority,
- COUNT(*) FILTER (WHERE priority = 'high') as high_priority,
- COUNT(*) FILTER (WHERE priority = 'urgent') as urgent_priority,
- COUNT(*) FILTER (WHERE priority = 'critical') as critical_priority,
- COUNT(*) FILTER (WHERE due_date < NOW() AND status NOT IN ('completed', 'cancelled')) as overdue_tasks,
- COUNT(*) FILTER (WHERE status = 'completed' AND completed_at >= NOW() - INTERVAL '7 days') as completed_this_week,
- AVG(EXTRACT(EPOCH FROM (completed_at - created_at)) / 3600) FILTER (WHERE completed_at IS NOT NULL) as avg_completion_hours
- FROM ${this.tableName}
- ${userCondition}
- `;
- const result = await this.executeRawQuery(sql, params, client);
- const stats = result.rows[0];
- return {
- totalTasks: parseInt(stats.total_tasks, 10),
- tasksByStatus: {
- pending: parseInt(stats.pending_tasks, 10),
- in_progress: parseInt(stats.in_progress_tasks, 10),
- review: parseInt(stats.review_tasks, 10),
- completed: parseInt(stats.completed_tasks, 10),
- cancelled: parseInt(stats.cancelled_tasks, 10),
- on_hold: parseInt(stats.on_hold_tasks, 10)
- },
- tasksByPriority: {
- low: parseInt(stats.low_priority, 10),
- medium: parseInt(stats.medium_priority, 10),
- high: parseInt(stats.high_priority, 10),
- urgent: parseInt(stats.urgent_priority, 10),
- critical: parseInt(stats.critical_priority, 10)
- },
- overdueTasks: parseInt(stats.overdue_tasks, 10),
- completedThisWeek: parseInt(stats.completed_this_week, 10),
- averageCompletionTime: parseFloat(stats.avg_completion_hours || '0')
- };
- }
- /**
- * Add watcher to task
- */
- async addWatcher(taskId, userId, client) {
- const sql = `
- UPDATE ${this.tableName}
- SET watchers = array_append(watchers, $2)
- WHERE id = $1
- AND deleted_at IS NULL
- AND NOT ($2 = ANY(watchers))
- `;
- const result = await this.executeRawQuery(sql, [taskId, userId], client);
- return result.rowCount > 0;
- }
- /**
- * Remove watcher from task
- */
- async removeWatcher(taskId, userId, client) {
- const sql = `
- UPDATE ${this.tableName}
- SET watchers = array_remove(watchers, $2)
- WHERE id = $1
- AND deleted_at IS NULL
- AND $2 = ANY(watchers)
- `;
- const result = await this.executeRawQuery(sql, [taskId, userId], client);
- return result.rowCount > 0;
- }
-}
-exports.default = TaskRepository;
-//# sourceMappingURL=TaskRepository.js.map
\ No newline at end of file
diff --git a/backend/dist/db/TaskRepository.js.map b/backend/dist/db/TaskRepository.js.map
deleted file mode 100644
index b02ed29..0000000
--- a/backend/dist/db/TaskRepository.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"TaskRepository.js","sourceRoot":"","sources":["../../src/db/TaskRepository.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/db/UserRepository.d.ts b/backend/dist/db/UserRepository.d.ts
deleted file mode 100644
index 08b498d..0000000
--- a/backend/dist/db/UserRepository.d.ts
+++ /dev/null
@@ -1,154 +0,0 @@
-import { DatabaseClient } from '@config/database';
-import BaseRepository, { BaseEntity } from './BaseRepository';
-export interface User extends BaseEntity {
- email: string;
- name: string;
- password_hash: string;
- role: 'ceo' | 'manager' | 'staff';
- avatar_url?: string;
- phone?: string;
- department?: string;
- job_title?: string;
- language_preference: string;
- timezone: string;
- notification_settings: Record;
- voice_settings: Record;
- failed_login_attempts: number;
- account_locked_until?: Date;
- password_reset_token?: string;
- password_reset_expires?: Date;
- email_verification_token?: string;
- email_verified: boolean;
- last_active?: Date;
- last_login?: Date;
- login_count: number;
- created_by?: string;
-}
-export interface CreateUserData {
- email: string;
- name: string;
- password: string;
- role: 'ceo' | 'manager' | 'staff';
- avatar_url?: string;
- phone?: string;
- department?: string;
- job_title?: string;
- language_preference?: string;
- timezone?: string;
- notification_settings?: Record;
- voice_settings?: Record;
- created_by?: string;
-}
-export interface UpdateUserData {
- name?: string;
- avatar_url?: string;
- phone?: string;
- department?: string;
- job_title?: string;
- language_preference?: string;
- timezone?: string;
- notification_settings?: Record;
- voice_settings?: Record;
-}
-export interface UserStats {
- totalUsers: number;
- activeUsers: number;
- usersByRole: Record;
- recentLogins: number;
- averageLoginCount: number;
-}
-declare class UserRepository extends BaseRepository {
- constructor();
- /**
- * Create new user with password hashing
- */
- createUser(userData: CreateUserData, client?: DatabaseClient): Promise;
- /**
- * Find user by email
- */
- findByEmail(email: string, includeDeleted?: boolean, client?: DatabaseClient): Promise;
- /**
- * Find user by email for authentication (includes password hash)
- */
- findByEmailForAuth(email: string, client?: DatabaseClient): Promise<(User & {
- password_hash: string;
- }) | null>;
- /**
- * Find users by role
- */
- findByRole(role: User['role'], includeDeleted?: boolean, client?: DatabaseClient): Promise;
- /**
- * Find users by department
- */
- findByDepartment(department: string, includeDeleted?: boolean, client?: DatabaseClient): Promise;
- /**
- * Update user password
- */
- updatePassword(userId: string, newPassword: string, expectedVersion?: number, client?: DatabaseClient): Promise;
- /**
- * Verify user password
- */
- verifyPassword(email: string, password: string, client?: DatabaseClient): Promise;
- /**
- * Record successful login
- */
- recordSuccessfulLogin(userId: string, client?: DatabaseClient): Promise;
- /**
- * Increment failed login attempts and potentially lock account
- */
- incrementFailedLoginAttempts(userId: string, client?: DatabaseClient): Promise;
- /**
- * Update last active timestamp
- */
- updateLastActive(userId: string, client?: DatabaseClient): Promise;
- /**
- * Set password reset token
- */
- setPasswordResetToken(email: string, token: string, expiresIn?: string, client?: DatabaseClient): Promise;
- /**
- * Verify password reset token
- */
- verifyPasswordResetToken(token: string, client?: DatabaseClient): Promise;
- /**
- * Set email verification token
- */
- setEmailVerificationToken(userId: string, token: string, client?: DatabaseClient): Promise;
- /**
- * Verify email with token
- */
- verifyEmail(token: string, client?: DatabaseClient): Promise;
- /**
- * Search users by name or email
- */
- searchUsers(searchTerm: string, limit?: number, offset?: number, client?: DatabaseClient): Promise;
- /**
- * Get active users (logged in recently)
- */
- getActiveUsers(withinHours?: number, client?: DatabaseClient): Promise;
- /**
- * Get user statistics
- */
- getUserStats(client?: DatabaseClient): Promise;
- /**
- * Update user profile
- */
- updateProfile(userId: string, profileData: UpdateUserData, expectedVersion?: number, client?: DatabaseClient): Promise;
- /**
- * Unlock user account
- */
- unlockAccount(userId: string, client?: DatabaseClient): Promise;
- /**
- * Get users for channel assignment suggestions
- */
- getUsersForChannelAssignment(channelId: string, excludeUserIds?: string[], client?: DatabaseClient): Promise;
- /**
- * Find all unverified users
- */
- findUnverifiedUsers(client?: DatabaseClient): Promise;
- /**
- * Delete all unverified users (hard delete for cleanup)
- */
- deleteUnverifiedUsers(client?: DatabaseClient): Promise;
-}
-export default UserRepository;
-//# sourceMappingURL=UserRepository.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/db/UserRepository.d.ts.map b/backend/dist/db/UserRepository.d.ts.map
deleted file mode 100644
index e7d214f..0000000
--- a/backend/dist/db/UserRepository.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"UserRepository.d.ts","sourceRoot":"","sources":["../../src/db/UserRepository.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/db/UserRepository.js b/backend/dist/db/UserRepository.js
deleted file mode 100644
index 8662dcb..0000000
--- a/backend/dist/db/UserRepository.js
+++ /dev/null
@@ -1,427 +0,0 @@
-"use strict";
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-const logger_1 = require("@utils/logger");
-const errors_1 = require("@utils/errors");
-const BaseRepository_1 = __importDefault(require("./BaseRepository"));
-const bcryptjs_1 = __importDefault(require("bcryptjs"));
-const index_1 = require("@config/index");
-class UserRepository extends BaseRepository_1.default {
- constructor() {
- super('users');
- // Exclude sensitive fields from default select
- this.selectFields = [
- 'id',
- 'email',
- 'name',
- 'role',
- 'avatar_url',
- 'phone',
- 'department',
- 'job_title',
- 'language_preference',
- 'timezone',
- 'notification_settings',
- 'voice_settings',
- 'email_verified',
- 'last_active',
- 'last_login',
- 'login_count',
- 'created_at',
- 'updated_at',
- 'version',
- 'deleted_at',
- 'created_by',
- ];
- }
- /**
- * Create new user with password hashing
- */
- async createUser(userData, client) {
- // Validate unique email
- const existingUser = await this.findByEmail(userData.email, false, client);
- if (existingUser) {
- throw new errors_1.ConflictError('Email already exists', { email: userData.email });
- }
- // Validate CEO uniqueness
- if (userData.role === 'ceo') {
- const existingCEO = await this.findByRole('ceo', false, client);
- if (existingCEO.length > 0) {
- throw new errors_1.ConflictError('CEO role already exists', { role: 'ceo' });
- }
- }
- // Hash password
- const password_hash = await bcryptjs_1.default.hash(userData.password, index_1.config.security.bcryptRounds);
- // Prepare user data
- const { password, ...userDataWithoutPassword } = userData;
- const userToCreate = {
- ...userDataWithoutPassword,
- password_hash,
- email_verified: false,
- failed_login_attempts: 0,
- login_count: 0,
- language_preference: userData.language_preference || 'en',
- timezone: userData.timezone || 'UTC',
- };
- const user = await this.create(userToCreate, client);
- logger_1.logger.info({
- userId: user.id,
- email: user.email,
- role: user.role,
- }, 'User created successfully');
- return user;
- }
- /**
- * Find user by email
- */
- async findByEmail(email, includeDeleted = false, client) {
- const deletedCondition = includeDeleted ? '' : 'AND deleted_at IS NULL';
- const sql = `
- SELECT ${this.selectFields.join(', ')}
- FROM ${this.tableName}
- WHERE LOWER(email) = LOWER($1) ${deletedCondition}
- `;
- const result = await this.executeRawQuery(sql, [email], client);
- return result.rows[0] || null;
- }
- /**
- * Find user by email for authentication (includes password hash)
- */
- async findByEmailForAuth(email, client) {
- const sql = `
- SELECT id, email, name, role, password_hash, email_verified,
- failed_login_attempts, account_locked_until, version,
- last_active, last_login, login_count
- FROM ${this.tableName}
- WHERE LOWER(email) = LOWER($1) AND deleted_at IS NULL
- `;
- const result = await this.executeRawQuery(sql, [email], client);
- return result.rows[0] || null;
- }
- /**
- * Find users by role
- */
- async findByRole(role, includeDeleted = false, client) {
- const options = {
- filters: { role },
- includeDeleted,
- orderBy: 'name',
- orderDirection: 'ASC',
- };
- const result = await this.findMany(options, client);
- return result.data;
- }
- /**
- * Find users by department
- */
- async findByDepartment(department, includeDeleted = false, client) {
- const options = {
- filters: { department },
- includeDeleted,
- orderBy: 'name',
- orderDirection: 'ASC',
- };
- const result = await this.findMany(options, client);
- return result.data;
- }
- /**
- * Update user password
- */
- async updatePassword(userId, newPassword, expectedVersion, client) {
- const password_hash = await bcryptjs_1.default.hash(newPassword, index_1.config.security.bcryptRounds);
- const sql = `
- UPDATE ${this.tableName}
- SET password_hash = $2, password_reset_token = NULL, password_reset_expires = NULL
- WHERE id = $1 AND deleted_at IS NULL
- ${expectedVersion ? 'AND version = $3' : ''}
- RETURNING id
- `;
- const params = expectedVersion
- ? [userId, password_hash, expectedVersion]
- : [userId, password_hash];
- const result = await this.executeRawQuery(sql, params, client);
- const success = result.rows.length > 0;
- if (success) {
- logger_1.logger.info({ userId }, 'User password updated successfully');
- }
- return success;
- }
- /**
- * Verify user password
- */
- async verifyPassword(email, password, client) {
- const user = await this.findByEmailForAuth(email, client);
- if (!user) {
- return null;
- }
- // Check account lock
- if (user.account_locked_until && user.account_locked_until > new Date()) {
- throw new errors_1.ValidationError('Account is temporarily locked', [
- {
- field: 'account',
- message: 'Account locked due to failed login attempts',
- value: user.account_locked_until,
- },
- ]);
- }
- const isValidPassword = await bcryptjs_1.default.compare(password, user.password_hash);
- if (!isValidPassword) {
- // Increment failed attempts
- await this.incrementFailedLoginAttempts(user.id, client);
- return null;
- }
- // Reset failed attempts and update login info
- await this.recordSuccessfulLogin(user.id, client);
- // Return user without password hash
- const { password_hash, ...userWithoutPassword } = user;
- return userWithoutPassword;
- }
- /**
- * Record successful login
- */
- async recordSuccessfulLogin(userId, client) {
- const sql = `
- UPDATE ${this.tableName}
- SET
- failed_login_attempts = 0,
- account_locked_until = NULL,
- last_login = NOW(),
- last_active = NOW(),
- login_count = login_count + 1
- WHERE id = $1
- `;
- await this.executeRawQuery(sql, [userId], client);
- }
- /**
- * Increment failed login attempts and potentially lock account
- */
- async incrementFailedLoginAttempts(userId, client) {
- const maxAttempts = index_1.config.security.maxLoginAttempts;
- const lockoutDuration = index_1.config.security.lockoutDuration;
- const sql = `
- UPDATE ${this.tableName}
- SET
- failed_login_attempts = failed_login_attempts + 1,
- account_locked_until = CASE
- WHEN failed_login_attempts + 1 >= $2 THEN NOW() + INTERVAL '${lockoutDuration}'
- ELSE account_locked_until
- END
- WHERE id = $1
- `;
- await this.executeRawQuery(sql, [userId, maxAttempts], client);
- logger_1.logger.warn({ userId }, 'Failed login attempt recorded');
- }
- /**
- * Update last active timestamp
- */
- async updateLastActive(userId, client) {
- const sql = `
- UPDATE ${this.tableName}
- SET last_active = NOW()
- WHERE id = $1 AND deleted_at IS NULL
- `;
- await this.executeRawQuery(sql, [userId], client);
- }
- /**
- * Set password reset token
- */
- async setPasswordResetToken(email, token, expiresIn = '1 hour', client) {
- const sql = `
- UPDATE ${this.tableName}
- SET
- password_reset_token = $2,
- password_reset_expires = NOW() + INTERVAL '${expiresIn}'
- WHERE LOWER(email) = LOWER($1) AND deleted_at IS NULL
- `;
- const result = await this.executeRawQuery(sql, [email, token], client);
- return result.rowCount > 0;
- }
- /**
- * Verify password reset token
- */
- async verifyPasswordResetToken(token, client) {
- const sql = `
- SELECT ${this.selectFields.join(', ')}
- FROM ${this.tableName}
- WHERE password_reset_token = $1
- AND password_reset_expires > NOW()
- AND deleted_at IS NULL
- `;
- const result = await this.executeRawQuery(sql, [token], client);
- return result.rows[0] || null;
- }
- /**
- * Set email verification token
- */
- async setEmailVerificationToken(userId, token, client) {
- const sql = `
- UPDATE ${this.tableName}
- SET email_verification_token = $2
- WHERE id = $1 AND deleted_at IS NULL
- `;
- const result = await this.executeRawQuery(sql, [userId, token], client);
- return result.rowCount > 0;
- }
- /**
- * Verify email with token
- */
- async verifyEmail(token, client) {
- const sql = `
- UPDATE ${this.tableName}
- SET
- email_verified = true,
- email_verification_token = NULL
- WHERE email_verification_token = $1 AND deleted_at IS NULL
- RETURNING ${this.selectFields.join(', ')}
- `;
- const result = await this.executeRawQuery(sql, [token], client);
- if (result.rows.length > 0 && result.rows[0]) {
- logger_1.logger.info({ userId: result.rows[0].id }, 'Email verified successfully');
- }
- return result.rows[0] || null;
- }
- /**
- * Search users by name or email
- */
- async searchUsers(searchTerm, limit = 20, offset = 0, client) {
- const sql = `
- SELECT ${this.selectFields.join(', ')}
- FROM ${this.tableName}
- WHERE (
- LOWER(name) LIKE LOWER($1) OR
- LOWER(email) LIKE LOWER($1) OR
- LOWER(department) LIKE LOWER($1) OR
- LOWER(job_title) LIKE LOWER($1)
- )
- AND deleted_at IS NULL
- ORDER BY
- CASE WHEN LOWER(name) LIKE LOWER($1) THEN 1 ELSE 2 END,
- name ASC
- LIMIT $2 OFFSET $3
- `;
- const searchPattern = `%${searchTerm}%`;
- const result = await this.executeRawQuery(sql, [searchPattern, limit, offset], client);
- return result.rows;
- }
- /**
- * Get active users (logged in recently)
- */
- async getActiveUsers(withinHours = 24, client) {
- const sql = `
- SELECT ${this.selectFields.join(', ')}
- FROM ${this.tableName}
- WHERE last_active > NOW() - INTERVAL '${withinHours} hours'
- AND deleted_at IS NULL
- ORDER BY last_active DESC
- `;
- const result = await this.executeRawQuery(sql, [], client);
- return result.rows;
- }
- /**
- * Get user statistics
- */
- async getUserStats(client) {
- const sql = `
- SELECT
- COUNT(*) as total_users,
- COUNT(*) FILTER (WHERE last_active > NOW() - INTERVAL '7 days') as active_users,
- COUNT(*) FILTER (WHERE role = 'ceo') as ceo_count,
- COUNT(*) FILTER (WHERE role = 'manager') as manager_count,
- COUNT(*) FILTER (WHERE role = 'staff') as staff_count,
- COUNT(*) FILTER (WHERE last_login > NOW() - INTERVAL '24 hours') as recent_logins,
- AVG(login_count) as average_login_count
- FROM ${this.tableName}
- WHERE deleted_at IS NULL
- `;
- const result = await this.executeRawQuery(sql, [], client);
- const stats = result.rows[0];
- return {
- totalUsers: parseInt(stats.total_users, 10),
- activeUsers: parseInt(stats.active_users, 10),
- usersByRole: {
- ceo: parseInt(stats.ceo_count, 10),
- manager: parseInt(stats.manager_count, 10),
- staff: parseInt(stats.staff_count, 10),
- },
- recentLogins: parseInt(stats.recent_logins, 10),
- averageLoginCount: parseFloat(stats.average_login_count || '0'),
- };
- }
- /**
- * Update user profile
- */
- async updateProfile(userId, profileData, expectedVersion, client) {
- return this.update(userId, profileData, expectedVersion, client);
- }
- /**
- * Unlock user account
- */
- async unlockAccount(userId, client) {
- const sql = `
- UPDATE ${this.tableName}
- SET
- failed_login_attempts = 0,
- account_locked_until = NULL
- WHERE id = $1 AND deleted_at IS NULL
- `;
- const result = await this.executeRawQuery(sql, [userId], client);
- if (result.rowCount > 0) {
- logger_1.logger.info({ userId }, 'User account unlocked');
- }
- return result.rowCount > 0;
- }
- /**
- * Get users for channel assignment suggestions
- */
- async getUsersForChannelAssignment(channelId, excludeUserIds = [], client) {
- const excludeCondition = excludeUserIds.length > 0 ? 'AND id != ALL($2)' : '';
- const sql = `
- SELECT ${this.selectFields.join(', ')}
- FROM ${this.tableName}
- WHERE deleted_at IS NULL
- AND email_verified = true
- ${excludeCondition}
- ORDER BY
- CASE role
- WHEN 'ceo' THEN 1
- WHEN 'manager' THEN 2
- ELSE 3
- END,
- last_active DESC NULLS LAST,
- name ASC
- LIMIT 50
- `;
- const params = excludeUserIds.length > 0 ? [excludeUserIds] : [];
- const result = await this.executeRawQuery(sql, params, client);
- return result.rows;
- }
- /**
- * Find all unverified users
- */
- async findUnverifiedUsers(client) {
- const sql = `
- SELECT ${this.selectFields.join(', ')}
- FROM ${this.tableName}
- WHERE email_verified = false AND deleted_at IS NULL
- ORDER BY created_at DESC
- `;
- const result = await this.executeRawQuery(sql, [], client);
- return result.rows;
- }
- /**
- * Delete all unverified users (hard delete for cleanup)
- */
- async deleteUnverifiedUsers(client) {
- const sql = `
- DELETE FROM ${this.tableName}
- WHERE email_verified = false AND deleted_at IS NULL
- `;
- const result = await this.executeRawQuery(sql, [], client);
- logger_1.logger.info({ deleteCount: result.rowCount }, 'Deleted unverified users');
- return result.rowCount || 0;
- }
-}
-exports.default = UserRepository;
-//# sourceMappingURL=UserRepository.js.map
\ No newline at end of file
diff --git a/backend/dist/db/UserRepository.js.map b/backend/dist/db/UserRepository.js.map
deleted file mode 100644
index 9b079f9..0000000
--- a/backend/dist/db/UserRepository.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"UserRepository.js","sourceRoot":"","sources":["../../src/db/UserRepository.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/db/index.d.ts b/backend/dist/db/index.d.ts
deleted file mode 100644
index 3feba7d..0000000
--- a/backend/dist/db/index.d.ts
+++ /dev/null
@@ -1,57 +0,0 @@
-/**
- * Database layer exports
- * Centralized access to all repositories and database utilities
- */
-export { default as BaseRepository } from './BaseRepository';
-export type { BaseEntity, FilterOptions, PaginatedResult } from './BaseRepository';
-export { default as UserRepository } from './UserRepository';
-export type { User, CreateUserData, UpdateUserData, UserStats } from './UserRepository';
-export { default as ChannelRepository } from './ChannelRepository';
-export type { Channel, CreateChannelData, ChannelWithDetails } from './ChannelRepository';
-export { default as TaskRepository } from './TaskRepository';
-export type { Task, CreateTaskData, TaskWithDetails, TaskFilter } from './TaskRepository';
-export { default as MessageRepository } from './MessageRepository';
-export type { Message, CreateMessageData, MessageWithUser } from './MessageRepository';
-export { default as ActivityRepository } from './ActivityRepository';
-export type { Activity, CreateActivityData, ActivityWithUser } from './ActivityRepository';
-export { default as FileRepository } from './FileRepository';
-export type { FileEntity, CreateFileData, FileWithUploader } from './FileRepository';
-export { default as AnnouncementRepository } from './AnnouncementRepository';
-export type { Announcement, CreateAnnouncementData, UpdateAnnouncementData, AnnouncementFilter } from './AnnouncementRepository';
-import UserRepository from './UserRepository';
-import ChannelRepository from './ChannelRepository';
-import TaskRepository from './TaskRepository';
-import MessageRepository from './MessageRepository';
-import ActivityRepository from './ActivityRepository';
-import FileRepository from './FileRepository';
-import AnnouncementRepository from './AnnouncementRepository';
-export declare const userRepository: UserRepository;
-export declare const channelRepository: ChannelRepository;
-export declare const taskRepository: TaskRepository;
-export declare const messageRepository: MessageRepository;
-export declare const activityRepository: ActivityRepository;
-export declare const fileRepository: FileRepository;
-export declare const announcementRepository: AnnouncementRepository;
-export declare const repositories: {
- readonly users: UserRepository;
- readonly channels: ChannelRepository;
- readonly tasks: TaskRepository;
- readonly messages: MessageRepository;
- readonly activities: ActivityRepository;
- readonly files: FileRepository;
- readonly announcements: AnnouncementRepository;
-};
-export type Repositories = typeof repositories;
-export { initializeDatabase, closeDatabase, getPool, query, transaction, healthCheck, getPoolStats, databaseMetrics } from '../config/database';
-export declare class DatabaseManager {
- private static instance;
- static getInstance(): DatabaseManager;
- query(text: string, params?: any[], client?: any): Promise;
- one(text: string, params?: any[], client?: any): Promise;
- many(text: string, params?: any[], client?: any): Promise;
- none(text: string, params?: any[], client?: any): Promise;
- transaction(callback: (client: any) => Promise): Promise;
-}
-export { runMigrations, rollbackLastMigration, getMigrationStatus, validateMigrations } from './migrator';
-export default repositories;
-//# sourceMappingURL=index.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/db/index.d.ts.map b/backend/dist/db/index.d.ts.map
deleted file mode 100644
index a0fd56b..0000000
--- a/backend/dist/db/index.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/db/index.js b/backend/dist/db/index.js
deleted file mode 100644
index d74fa17..0000000
--- a/backend/dist/db/index.js
+++ /dev/null
@@ -1,138 +0,0 @@
-"use strict";
-/**
- * Database layer exports
- * Centralized access to all repositories and database utilities
- */
-var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- var desc = Object.getOwnPropertyDescriptor(m, k);
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
- desc = { enumerable: true, get: function() { return m[k]; } };
- }
- Object.defineProperty(o, k2, desc);
-}) : (function(o, m, k, k2) {
- if (k2 === undefined) k2 = k;
- o[k2] = m[k];
-}));
-var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
- Object.defineProperty(o, "default", { enumerable: true, value: v });
-}) : function(o, v) {
- o["default"] = v;
-});
-var __importStar = (this && this.__importStar) || (function () {
- var ownKeys = function(o) {
- ownKeys = Object.getOwnPropertyNames || function (o) {
- var ar = [];
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
- return ar;
- };
- return ownKeys(o);
- };
- return function (mod) {
- if (mod && mod.__esModule) return mod;
- var result = {};
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
- __setModuleDefault(result, mod);
- return result;
- };
-})();
-var __importDefault = (this && this.__importDefault) || function (mod) {
- return (mod && mod.__esModule) ? mod : { "default": mod };
-};
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.validateMigrations = exports.getMigrationStatus = exports.rollbackLastMigration = exports.runMigrations = exports.DatabaseManager = exports.databaseMetrics = exports.getPoolStats = exports.healthCheck = exports.transaction = exports.query = exports.getPool = exports.closeDatabase = exports.initializeDatabase = exports.repositories = exports.announcementRepository = exports.fileRepository = exports.activityRepository = exports.messageRepository = exports.taskRepository = exports.channelRepository = exports.userRepository = exports.AnnouncementRepository = exports.FileRepository = exports.ActivityRepository = exports.MessageRepository = exports.TaskRepository = exports.ChannelRepository = exports.UserRepository = exports.BaseRepository = void 0;
-// Base repository
-var BaseRepository_1 = require("./BaseRepository");
-Object.defineProperty(exports, "BaseRepository", { enumerable: true, get: function () { return __importDefault(BaseRepository_1).default; } });
-// Specialized repositories
-var UserRepository_1 = require("./UserRepository");
-Object.defineProperty(exports, "UserRepository", { enumerable: true, get: function () { return __importDefault(UserRepository_1).default; } });
-var ChannelRepository_1 = require("./ChannelRepository");
-Object.defineProperty(exports, "ChannelRepository", { enumerable: true, get: function () { return __importDefault(ChannelRepository_1).default; } });
-var TaskRepository_1 = require("./TaskRepository");
-Object.defineProperty(exports, "TaskRepository", { enumerable: true, get: function () { return __importDefault(TaskRepository_1).default; } });
-var MessageRepository_1 = require("./MessageRepository");
-Object.defineProperty(exports, "MessageRepository", { enumerable: true, get: function () { return __importDefault(MessageRepository_1).default; } });
-var ActivityRepository_1 = require("./ActivityRepository");
-Object.defineProperty(exports, "ActivityRepository", { enumerable: true, get: function () { return __importDefault(ActivityRepository_1).default; } });
-var FileRepository_1 = require("./FileRepository");
-Object.defineProperty(exports, "FileRepository", { enumerable: true, get: function () { return __importDefault(FileRepository_1).default; } });
-var AnnouncementRepository_1 = require("./AnnouncementRepository");
-Object.defineProperty(exports, "AnnouncementRepository", { enumerable: true, get: function () { return __importDefault(AnnouncementRepository_1).default; } });
-// Repository instances for dependency injection
-const UserRepository_2 = __importDefault(require("./UserRepository"));
-const ChannelRepository_2 = __importDefault(require("./ChannelRepository"));
-const TaskRepository_2 = __importDefault(require("./TaskRepository"));
-const MessageRepository_2 = __importDefault(require("./MessageRepository"));
-const ActivityRepository_2 = __importDefault(require("./ActivityRepository"));
-const FileRepository_2 = __importDefault(require("./FileRepository"));
-const AnnouncementRepository_2 = __importDefault(require("./AnnouncementRepository"));
-// Create singleton instances
-exports.userRepository = new UserRepository_2.default();
-exports.channelRepository = new ChannelRepository_2.default();
-exports.taskRepository = new TaskRepository_2.default();
-exports.messageRepository = new MessageRepository_2.default();
-exports.activityRepository = new ActivityRepository_2.default();
-exports.fileRepository = new FileRepository_2.default();
-exports.announcementRepository = new AnnouncementRepository_2.default();
-// Repository collection for easy access
-exports.repositories = {
- users: exports.userRepository,
- channels: exports.channelRepository,
- tasks: exports.taskRepository,
- messages: exports.messageRepository,
- activities: exports.activityRepository,
- files: exports.fileRepository,
- announcements: exports.announcementRepository,
-};
-// Database configuration and utilities
-var database_1 = require("../config/database");
-Object.defineProperty(exports, "initializeDatabase", { enumerable: true, get: function () { return database_1.initializeDatabase; } });
-Object.defineProperty(exports, "closeDatabase", { enumerable: true, get: function () { return database_1.closeDatabase; } });
-Object.defineProperty(exports, "getPool", { enumerable: true, get: function () { return database_1.getPool; } });
-Object.defineProperty(exports, "query", { enumerable: true, get: function () { return database_1.query; } });
-Object.defineProperty(exports, "transaction", { enumerable: true, get: function () { return database_1.transaction; } });
-Object.defineProperty(exports, "healthCheck", { enumerable: true, get: function () { return database_1.healthCheck; } });
-Object.defineProperty(exports, "getPoolStats", { enumerable: true, get: function () { return database_1.getPoolStats; } });
-Object.defineProperty(exports, "databaseMetrics", { enumerable: true, get: function () { return database_1.databaseMetrics; } });
-// DatabaseManager class for Phase 2 compatibility
-class DatabaseManager {
- static instance;
- static getInstance() {
- if (!DatabaseManager.instance) {
- DatabaseManager.instance = new DatabaseManager();
- }
- return DatabaseManager.instance;
- }
- async query(text, params, client) {
- const { query } = await Promise.resolve().then(() => __importStar(require('../config/database')));
- return await query(text, params, client);
- }
- async one(text, params, client) {
- const result = await this.query(text, params, client);
- if (result.rows.length === 0) {
- throw new Error('No rows returned');
- }
- return result.rows[0];
- }
- async many(text, params, client) {
- const result = await this.query(text, params, client);
- return result.rows;
- }
- async none(text, params, client) {
- await this.query(text, params, client);
- }
- async transaction(callback) {
- const { transaction } = await Promise.resolve().then(() => __importStar(require('../config/database')));
- return await transaction(callback);
- }
-}
-exports.DatabaseManager = DatabaseManager;
-// Migration system
-var migrator_1 = require("./migrator");
-Object.defineProperty(exports, "runMigrations", { enumerable: true, get: function () { return migrator_1.runMigrations; } });
-Object.defineProperty(exports, "rollbackLastMigration", { enumerable: true, get: function () { return migrator_1.rollbackLastMigration; } });
-Object.defineProperty(exports, "getMigrationStatus", { enumerable: true, get: function () { return migrator_1.getMigrationStatus; } });
-Object.defineProperty(exports, "validateMigrations", { enumerable: true, get: function () { return migrator_1.validateMigrations; } });
-exports.default = exports.repositories;
-//# sourceMappingURL=index.js.map
\ No newline at end of file
diff --git a/backend/dist/db/index.js.map b/backend/dist/db/index.js.map
deleted file mode 100644
index 60c14ff..0000000
--- a/backend/dist/db/index.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/db/index.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/db/migrator.d.ts b/backend/dist/db/migrator.d.ts
deleted file mode 100644
index f1e518b..0000000
--- a/backend/dist/db/migrator.d.ts
+++ /dev/null
@@ -1,32 +0,0 @@
-interface MigrationRecord {
- id: string;
- filename: string;
- executed_at: Date;
- checksum: string;
-}
-/**
- * Run all pending migrations
- */
-export declare const runMigrations: () => Promise;
-/**
- * Rollback the last migration (for development only)
- */
-export declare const rollbackLastMigration: () => Promise;
-/**
- * Get migration status for health checks
- */
-export declare const getMigrationStatus: () => Promise<{
- total: number;
- executed: number;
- pending: number;
- lastExecuted: MigrationRecord | undefined;
-}>;
-/**
- * Validate migration integrity
- */
-export declare const validateMigrations: () => Promise<{
- valid: boolean;
- errors: string[];
-}>;
-export {};
-//# sourceMappingURL=migrator.d.ts.map
\ No newline at end of file
diff --git a/backend/dist/db/migrator.d.ts.map b/backend/dist/db/migrator.d.ts.map
deleted file mode 100644
index 412431c..0000000
--- a/backend/dist/db/migrator.d.ts.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"migrator.d.ts","sourceRoot":"","sources":["../../src/db/migrator.ts"],"names":[],"mappings":"AAkBA,UAAU,eAAe;IACvB,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,WAAW,EAAE,IAAI,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;CAClB;AA4GD;;GAEG;AACH,eAAO,MAAM,aAAa,QAAa,OAAO,CAAC,IAAI,CA8ClD,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,qBAAqB,QAAa,OAAO,CAAC,IAAI,CAoD1D,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,QAAa,OAAO,CAAC;IAClD,KAAK,EAAE,MAAM,CAAC;IACd,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,YAAY,EAAE,eAAe,GAAG,SAAS,CAAC;CAC3C,CAeA,CAAC;AAEF;;GAEG;AACH,eAAO,MAAM,kBAAkB,QAAa,OAAO,CAAC;IAClD,KAAK,EAAE,OAAO,CAAC;IACf,MAAM,EAAE,MAAM,EAAE,CAAC;CAClB,CA2CA,CAAC"}
\ No newline at end of file
diff --git a/backend/dist/db/migrator.js b/backend/dist/db/migrator.js
deleted file mode 100644
index e9f0bf1..0000000
--- a/backend/dist/db/migrator.js
+++ /dev/null
@@ -1,239 +0,0 @@
-"use strict";
-Object.defineProperty(exports, "__esModule", { value: true });
-exports.validateMigrations = exports.getMigrationStatus = exports.rollbackLastMigration = exports.runMigrations = void 0;
-const promises_1 = require("fs/promises");
-const path_1 = require("path");
-const database_1 = require("@config/database");
-const logger_1 = require("@utils/logger");
-const errors_1 = require("@utils/errors");
-/**
- * Initialize migration tracking table
- */
-const initializeMigrationTable = async () => {
- const createTableSql = `
- CREATE TABLE IF NOT EXISTS migrations (
- id VARCHAR(255) PRIMARY KEY,
- filename VARCHAR(255) NOT NULL,
- executed_at TIMESTAMP WITH TIME ZONE DEFAULT NOW(),
- checksum VARCHAR(64) NOT NULL,
- execution_time_ms INTEGER,
- UNIQUE(filename)
- );
-
- CREATE INDEX IF NOT EXISTS idx_migrations_executed_at ON migrations(executed_at);
- `;
- await (0, database_1.query)(createTableSql);
- logger_1.logger.info('Migration tracking table initialized');
-};
-/**
- * Load migration files from the migrations directory
- */
-const loadMigrationFiles = async () => {
- try {
- const migrationsDir = (0, path_1.join)(process.cwd(), 'migrations');
- const files = await (0, promises_1.readdir)(migrationsDir);
- const sqlFiles = files.filter((file) => file.endsWith('.sql')).sort(); // Ensure proper ordering
- const migrations = [];
- for (const filename of sqlFiles) {
- const filepath = (0, path_1.join)(migrationsDir, filename);
- const sql = await (0, promises_1.readFile)(filepath, 'utf-8');
- // Extract timestamp from filename (format: YYYYMMDDHHMMSS_name.sql)
- const timestampMatch = filename.match(/^(\d{14})/);
- const timestamp = timestampMatch && timestampMatch[1] ? parseInt(timestampMatch[1], 10) : 0;
- migrations.push({
- id: filename.replace('.sql', ''),
- filename,
- timestamp,
- sql: sql.trim(),
- });
- }
- logger_1.logger.info({ count: migrations.length }, 'Loaded migration files');
- return migrations;
- }
- catch (error) {
- logger_1.logger.error({ error }, 'Failed to load migration files');
- throw new errors_1.DatabaseError('Failed to load migration files');
- }
-};
-/**
- * Get executed migrations from database
- */
-const getExecutedMigrations = async () => {
- const result = await (0, database_1.query)('SELECT * FROM migrations ORDER BY executed_at ASC');
- return result.rows;
-};
-/**
- * Calculate checksum for migration content
- */
-const calculateChecksum = (content) => {
- const crypto = require('crypto');
- return crypto.createHash('sha256').update(content).digest('hex');
-};
-/**
- * Execute a single migration
- */
-const executeMigration = async (migration) => {
- const startTime = Date.now();
- await (0, database_1.transaction)(async (client) => {
- logger_1.logger.info({ migration: migration.filename }, 'Executing migration');
- // Execute the migration SQL
- await client.query(migration.sql);
- // Record the migration execution
- const executionTime = Date.now() - startTime;
- const checksum = calculateChecksum(migration.sql);
- await client.query(`INSERT INTO migrations (id, filename, executed_at, checksum, execution_time_ms)
- VALUES ($1, $2, NOW(), $3, $4)`, [migration.id, migration.filename, checksum, executionTime]);
- logger_1.logger.info({
- migration: migration.filename,
- executionTime,
- }, 'Migration executed successfully');
- });
-};
-/**
- * Run all pending migrations
- */
-const runMigrations = async () => {
- try {
- logger_1.logger.info('Starting database migrations...');
- // Initialize migration tracking
- await initializeMigrationTable();
- // Load all migration files
- const allMigrations = await loadMigrationFiles();
- // Get executed migrations
- const executedMigrations = await getExecutedMigrations();
- const executedIds = new Set(executedMigrations.map((m) => m.id));
- // Find pending migrations
- const pendingMigrations = allMigrations.filter((m) => !executedIds.has(m.id));
- if (pendingMigrations.length === 0) {
- logger_1.logger.info('No pending migrations found');
- return;
- }
- logger_1.logger.info({
- total: allMigrations.length,
- executed: executedMigrations.length,
- pending: pendingMigrations.length,
- }, 'Migration status');
- // Execute pending migrations in order
- for (const migration of pendingMigrations) {
- await executeMigration(migration);
- }
- logger_1.logger.info({
- executedCount: pendingMigrations.length,
- }, 'All migrations completed successfully');
- }
- catch (error) {
- logger_1.logger.error({ error }, 'Migration failed');
- throw new errors_1.DatabaseError('Migration execution failed');
- }
-};
-exports.runMigrations = runMigrations;
-/**
- * Rollback the last migration (for development only)
- */
-const rollbackLastMigration = async () => {
- if (process.env.NODE_ENV === 'production') {
- throw new errors_1.DatabaseError('Rollback not allowed in production');
- }
- try {
- const executedMigrations = await getExecutedMigrations();
- if (executedMigrations.length === 0) {
- logger_1.logger.info('No migrations to rollback');
- return;
- }
- const lastMigration = executedMigrations[executedMigrations.length - 1];
- if (!lastMigration) {
- logger_1.logger.info('No migrations to rollback');
- return;
- }
- // Check if rollback SQL exists
- const rollbackFilename = lastMigration.filename.replace('.sql', '.rollback.sql');
- const rollbackPath = (0, path_1.join)(process.cwd(), 'migrations', rollbackFilename);
- try {
- const rollbackSql = await (0, promises_1.readFile)(rollbackPath, 'utf-8');
- await (0, database_1.transaction)(async (client) => {
- logger_1.logger.warn({ migration: lastMigration.filename }, 'Rolling back migration');
- // Execute rollback SQL
- await client.query(rollbackSql);
- // Remove from migration records
- await client.query('DELETE FROM migrations WHERE id = $1', [lastMigration.id]);
- logger_1.logger.warn({
- migration: lastMigration.filename,
- }, 'Migration rolled back successfully');
- });
- }
- catch (rollbackError) {
- throw new errors_1.DatabaseError(`Rollback file not found or invalid: ${rollbackFilename}`, {
- lastMigration: lastMigration.filename,
- });
- }
- }
- catch (error) {
- logger_1.logger.error({ error }, 'Rollback failed');
- throw new errors_1.DatabaseError('Migration rollback failed');
- }
-};
-exports.rollbackLastMigration = rollbackLastMigration;
-/**
- * Get migration status for health checks
- */
-const getMigrationStatus = async () => {
- try {
- const allMigrations = await loadMigrationFiles();
- const executedMigrations = await getExecutedMigrations();
- return {
- total: allMigrations.length,
- executed: executedMigrations.length,
- pending: allMigrations.length - executedMigrations.length,
- lastExecuted: executedMigrations[executedMigrations.length - 1],
- };
- }
- catch (error) {
- logger_1.logger.error({ error }, 'Failed to get migration status');
- throw new errors_1.DatabaseError('Failed to get migration status');
- }
-};
-exports.getMigrationStatus = getMigrationStatus;
-/**
- * Validate migration integrity
- */
-const validateMigrations = async () => {
- const errors = [];
- try {
- const allMigrations = await loadMigrationFiles();
- const executedMigrations = await getExecutedMigrations();
- // Check for checksum mismatches
- for (const executed of executedMigrations) {
- const migration = allMigrations.find((m) => m.id === executed.id);
- if (!migration) {
- errors.push(`Migration ${executed.filename} was executed but file no longer exists`);
- continue;
- }
- const currentChecksum = calculateChecksum(migration.sql);
- if (currentChecksum !== executed.checksum) {
- errors.push(`Migration ${executed.filename} has been modified after execution`);
- }
- }
- // Check for gaps in migration sequence
- const timestamps = allMigrations
- .map((m) => m.timestamp)
- .filter((t) => typeof t === 'number')
- .sort();
- for (let i = 1; i < timestamps.length; i++) {
- const current = timestamps[i];
- const previous = timestamps[i - 1];
- if (typeof current === 'number' && typeof previous === 'number' && current <= previous) {
- errors.push(`Migration timestamp ordering issue detected`);
- break;
- }
- }
- }
- catch (error) {
- errors.push(`Validation failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
- }
- return {
- valid: errors.length === 0,
- errors,
- };
-};
-exports.validateMigrations = validateMigrations;
-//# sourceMappingURL=migrator.js.map
\ No newline at end of file
diff --git a/backend/dist/db/migrator.js.map b/backend/dist/db/migrator.js.map
deleted file mode 100644
index 91b8723..0000000
--- a/backend/dist/db/migrator.js.map
+++ /dev/null
@@ -1 +0,0 @@
-{"version":3,"file":"migrator.js","sourceRoot":"","sources":["../../src/db/migrator.ts"],"names":[],"mappings":"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"}
\ No newline at end of file
diff --git a/backend/dist/files/management/FileMetadataManager.d.ts b/backend/dist/files/management/FileMetadataManager.d.ts
deleted file mode 100644
index 67df58a..0000000
--- a/backend/dist/files/management/FileMetadataManager.d.ts
+++ /dev/null
@@ -1,113 +0,0 @@
-/**
- * File Metadata Manager - Phase 2 File Management System
- * Manages file metadata in database with entity linking capabilities
- *
- * Success Criteria:
- * - File record creation before upload
- * - Status tracking (pending, uploading, completed, failed)
- * - Entity linking (channels, tasks, users)
- * - Metadata indexing for fast search
- */
-export interface FileRecord {
- id: string;
- name: string;
- originalName: string;
- size: number;
- contentType: string;
- s3Key: string;
- uploadedBy: string;
- organizationId: string;
- status: FileStatus;
- description?: string;
- tags: string[];
- uploadedAt: Date;
- updatedAt: Date;
- downloadCount: number;
- lastDownloaded?: Date;
-}
-export declare enum FileStatus {
- PENDING = "pending",
- UPLOADING = "uploading",
- COMPLETED = "completed",
- FAILED = "failed",
- DELETED = "deleted"
-}
-export interface FileEntityLink {
- fileId: string;
- entityType: 'channel' | 'task' | 'user' | 'project';
- entityId: string;
- linkType: 'attachment' | 'share' | 'reference';
- linkedBy: string;
- linkedAt: Date;
-}
-export interface FileSearchQuery {
- organizationId: string;
- userId?: string;
- name?: string;
- contentType?: string;
- tags?: string[];
- entityType?: string;
- entityId?: string;
- status?: FileStatus;
- uploadedAfter?: Date;
- uploadedBefore?: Date;
- limit?: number;
- offset?: number;
-}
-export interface FileSearchResult {
- files: FileRecord[];
- totalCount: number;
- hasMore: boolean;
-}
-export declare class FileMetadataManager {
- private db;
- private performanceMetrics;
- constructor();
- /**
- * Create file record before upload process
- * Target: <200ms creation time
- */
- createFileRecord(name: string, originalName: string, size: number, contentType: string, s3Key: string, uploadedBy: string, organizationId: string, description?: string, tags?: string[]): Promise;
- /**
- * Update file status during upload lifecycle
- */
- updateFileStatus(fileId: string, status: FileStatus, error?: string): Promise;
- /**
- * Link file to entity (channel, task, user, project)
- */
- linkFileToEntity(fileId: string, entityType: FileEntityLink['entityType'], entityId: string, linkType: FileEntityLink["linkType"] | undefined, linkedBy: string): Promise;
- /**
- * Remove file-entity link
- */
- unlinkFileFromEntity(fileId: string, entityType: FileEntityLink['entityType'], entityId: string, linkType?: FileEntityLink['linkType']): Promise;
- /**
- * Get file record by ID
- */
- getFileRecord(fileId: string): Promise