Add new frontend - fix 19
This commit is contained in:
@@ -2,13 +2,46 @@
|
|||||||
import { apiClient } from '../base/apiClient';
|
import { apiClient } from '../base/apiClient';
|
||||||
import { tokenManager } from '../auth/tokenManager';
|
import { tokenManager } from '../auth/tokenManager';
|
||||||
import {
|
import {
|
||||||
ApiResponse,
|
ApiResponse
|
||||||
LoginRequest,
|
|
||||||
RegisterRequest,
|
|
||||||
TokenResponse,
|
|
||||||
UserProfile,
|
|
||||||
} from '../types/api';
|
} from '../types/api';
|
||||||
|
|
||||||
|
|
||||||
|
// Auth types
|
||||||
|
export interface LoginRequest {
|
||||||
|
email: string;
|
||||||
|
password: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface RegisterRequest {
|
||||||
|
email: string;
|
||||||
|
password: string;
|
||||||
|
full_name: string;
|
||||||
|
phone?: string;
|
||||||
|
language?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface TokenResponse {
|
||||||
|
access_token: string;
|
||||||
|
refresh_token: string;
|
||||||
|
token_type: string;
|
||||||
|
expires_in: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface UserProfile {
|
||||||
|
id: string;
|
||||||
|
email: string;
|
||||||
|
full_name: string;
|
||||||
|
is_active: boolean;
|
||||||
|
is_verified: boolean;
|
||||||
|
tenant_id?: string;
|
||||||
|
role: string;
|
||||||
|
phone?: string;
|
||||||
|
language: string;
|
||||||
|
timezone: string;
|
||||||
|
created_at?: string;
|
||||||
|
last_login?: string;
|
||||||
|
}
|
||||||
|
|
||||||
export class AuthService {
|
export class AuthService {
|
||||||
/**
|
/**
|
||||||
* Check if user is authenticated (has valid token)
|
* Check if user is authenticated (has valid token)
|
||||||
@@ -27,7 +60,7 @@ export class AuthService {
|
|||||||
* Get current user profile
|
* Get current user profile
|
||||||
*/
|
*/
|
||||||
async getCurrentUser(): Promise<UserProfile> {
|
async getCurrentUser(): Promise<UserProfile> {
|
||||||
const response = await apiClient.get<ApiResponse<UserProfile>>('/users/me');
|
const response = await apiClient.get<UserProfile>('/users/me');
|
||||||
return response.data!;
|
return response.data!;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -141,11 +174,11 @@ export class AuthService {
|
|||||||
* Update user profile
|
* Update user profile
|
||||||
*/
|
*/
|
||||||
async updateProfile(updates: Partial<UserProfile>): Promise<UserProfile> {
|
async updateProfile(updates: Partial<UserProfile>): Promise<UserProfile> {
|
||||||
const response = await apiClient.put<ApiResponse<UserProfile>>(
|
const response = await apiClient.put<UserProfile>(
|
||||||
'/api/v1/users/me',
|
'/api/v1/users/me',
|
||||||
updates
|
updates
|
||||||
);
|
);
|
||||||
return response.data!;
|
return response;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|||||||
@@ -1,11 +1,7 @@
|
|||||||
// src/api/services/DataService.ts
|
// src/api/services/DataService.ts
|
||||||
import { apiClient } from '../base/apiClient';
|
import { apiClient } from '../base/apiClient';
|
||||||
import {
|
import {
|
||||||
ApiResponse,
|
ApiResponse
|
||||||
SalesRecord,
|
|
||||||
CreateSalesRequest,
|
|
||||||
WeatherData,
|
|
||||||
TrafficData,
|
|
||||||
} from '../types/api';
|
} from '../types/api';
|
||||||
|
|
||||||
export interface DashboardStats {
|
export interface DashboardStats {
|
||||||
@@ -33,6 +29,38 @@ export interface DataValidation {
|
|||||||
duplicates: number;
|
duplicates: number;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Data types
|
||||||
|
export interface WeatherData {
|
||||||
|
date: string;
|
||||||
|
temperature: number;
|
||||||
|
humidity: number;
|
||||||
|
precipitation: number;
|
||||||
|
wind_speed: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface TrafficData {
|
||||||
|
date: string;
|
||||||
|
traffic_volume: number;
|
||||||
|
pedestrian_count: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface SalesRecord {
|
||||||
|
id: string;
|
||||||
|
tenant_id: string;
|
||||||
|
product_name: string;
|
||||||
|
quantity_sold: number;
|
||||||
|
revenue: number;
|
||||||
|
date: string;
|
||||||
|
created_at: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface CreateSalesRequest {
|
||||||
|
product_name: string;
|
||||||
|
quantity_sold: number;
|
||||||
|
revenue: number;
|
||||||
|
date: string;
|
||||||
|
}
|
||||||
|
|
||||||
export class DataService {
|
export class DataService {
|
||||||
/**
|
/**
|
||||||
* Upload sales history file
|
* Upload sales history file
|
||||||
|
|||||||
@@ -1,11 +1,30 @@
|
|||||||
// src/api/services/ForecastingService.ts
|
// src/api/services/ForecastingService.ts
|
||||||
import { apiClient } from '../base/apiClient';
|
import { apiClient } from '../base/apiClient';
|
||||||
import {
|
import {
|
||||||
ApiResponse,
|
ApiResponse
|
||||||
ForecastRecord,
|
|
||||||
ForecastRequest,
|
|
||||||
} from '../types/api';
|
} from '../types/api';
|
||||||
|
|
||||||
|
// Forecast types
|
||||||
|
export interface ForecastRecord {
|
||||||
|
id: string;
|
||||||
|
tenant_id: string;
|
||||||
|
product_name: string;
|
||||||
|
forecast_date: string;
|
||||||
|
predicted_quantity: number;
|
||||||
|
confidence_lower: number;
|
||||||
|
confidence_upper: number;
|
||||||
|
model_version: string;
|
||||||
|
created_at: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ForecastRequest {
|
||||||
|
product_name?: string;
|
||||||
|
forecast_days?: number;
|
||||||
|
include_confidence?: boolean;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
export interface SingleForecastRequest {
|
export interface SingleForecastRequest {
|
||||||
product_name: string;
|
product_name: string;
|
||||||
forecast_date: string;
|
forecast_date: string;
|
||||||
|
|||||||
@@ -2,8 +2,8 @@
|
|||||||
import { apiClient } from '../base/apiClient';
|
import { apiClient } from '../base/apiClient';
|
||||||
import {
|
import {
|
||||||
ApiResponse,
|
ApiResponse,
|
||||||
NotificationSettings,
|
NotificationSettings
|
||||||
} from '../types/api';
|
} from '@/api/services';
|
||||||
|
|
||||||
export interface NotificationCreate {
|
export interface NotificationCreate {
|
||||||
type: 'email' | 'whatsapp' | 'push';
|
type: 'email' | 'whatsapp' | 'push';
|
||||||
@@ -101,6 +101,19 @@ export interface BulkNotificationStatus {
|
|||||||
completed_at?: string;
|
completed_at?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Notification types
|
||||||
|
export interface NotificationSettings {
|
||||||
|
email_enabled: boolean;
|
||||||
|
whatsapp_enabled: boolean;
|
||||||
|
training_notifications: boolean;
|
||||||
|
forecast_notifications: boolean;
|
||||||
|
alert_thresholds: {
|
||||||
|
low_stock_percentage: number;
|
||||||
|
high_demand_increase: number;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
export class NotificationService {
|
export class NotificationService {
|
||||||
/**
|
/**
|
||||||
* Send single notification
|
* Send single notification
|
||||||
|
|||||||
@@ -1,9 +1,8 @@
|
|||||||
// src/api/services/TenantService.ts
|
// src/api/services/TenantService.ts
|
||||||
import { apiClient } from '../base/apiClient';
|
import { apiClient } from '../base/apiClient';
|
||||||
import {
|
import {
|
||||||
ApiResponse,
|
ApiResponse
|
||||||
TenantInfo, // Assuming TenantInfo is equivalent to TenantResponse from backend
|
} from '@/api/services';
|
||||||
} from '../types/api';
|
|
||||||
|
|
||||||
export interface TenantCreate {
|
export interface TenantCreate {
|
||||||
name: string;
|
name: string;
|
||||||
@@ -92,6 +91,20 @@ export interface TenantMemberResponse {
|
|||||||
// Add any other fields expected from the backend's TenantMemberResponse
|
// Add any other fields expected from the backend's TenantMemberResponse
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Tenant types
|
||||||
|
export interface TenantInfo {
|
||||||
|
id: string;
|
||||||
|
name: string;
|
||||||
|
email: string;
|
||||||
|
phone: string;
|
||||||
|
address: string;
|
||||||
|
latitude: number;
|
||||||
|
longitude: number;
|
||||||
|
business_type: string;
|
||||||
|
is_active: boolean;
|
||||||
|
created_at: string;
|
||||||
|
}
|
||||||
|
|
||||||
export class TenantService {
|
export class TenantService {
|
||||||
/**
|
/**
|
||||||
* Register a new bakery (tenant)
|
* Register a new bakery (tenant)
|
||||||
|
|||||||
@@ -1,12 +1,49 @@
|
|||||||
// src/api/services/TrainingService.ts
|
// src/api/services/TrainingService.ts
|
||||||
import { apiClient } from '../base/apiClient';
|
import { apiClient } from '../base/apiClient';
|
||||||
import {
|
import {
|
||||||
ApiResponse,
|
ApiResponse
|
||||||
TrainingRequest,
|
|
||||||
TrainingJobStatus,
|
|
||||||
TrainedModel,
|
|
||||||
} from '../types/api';
|
} from '../types/api';
|
||||||
|
|
||||||
|
import {
|
||||||
|
ApiResponse
|
||||||
|
} from '@/api/services';
|
||||||
|
|
||||||
|
export interface TrainingJobStatus {
|
||||||
|
id: string;
|
||||||
|
tenant_id: string;
|
||||||
|
status: 'queued' | 'running' | 'completed' | 'failed' | 'cancelled';
|
||||||
|
progress: number;
|
||||||
|
current_step?: string;
|
||||||
|
started_at: string;
|
||||||
|
completed_at?: string;
|
||||||
|
duration_seconds?: number;
|
||||||
|
models_trained?: Record<string, any>;
|
||||||
|
metrics?: Record<string, any>;
|
||||||
|
error_message?: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface TrainingRequest {
|
||||||
|
force_retrain?: boolean;
|
||||||
|
products?: string[];
|
||||||
|
training_days?: number;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface TrainedModel {
|
||||||
|
id: string;
|
||||||
|
product_name: string;
|
||||||
|
model_type: string;
|
||||||
|
model_version: string;
|
||||||
|
mape?: number;
|
||||||
|
rmse?: number;
|
||||||
|
mae?: number;
|
||||||
|
r2_score?: number;
|
||||||
|
training_samples?: number;
|
||||||
|
features_used?: string[];
|
||||||
|
is_active: boolean;
|
||||||
|
created_at: string;
|
||||||
|
last_used_at?: string;
|
||||||
|
}
|
||||||
|
|
||||||
export interface TrainingJobProgress {
|
export interface TrainingJobProgress {
|
||||||
id: string;
|
id: string;
|
||||||
status: 'queued' | 'running' | 'completed' | 'failed' | 'cancelled';
|
status: 'queued' | 'running' | 'completed' | 'failed' | 'cancelled';
|
||||||
|
|||||||
@@ -18,153 +18,3 @@ export interface ApiError {
|
|||||||
timestamp?: string;
|
timestamp?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Auth types
|
|
||||||
export interface LoginRequest {
|
|
||||||
email: string;
|
|
||||||
password: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface RegisterRequest {
|
|
||||||
email: string;
|
|
||||||
password: string;
|
|
||||||
full_name: string;
|
|
||||||
phone?: string;
|
|
||||||
language?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface TokenResponse {
|
|
||||||
access_token: string;
|
|
||||||
refresh_token: string;
|
|
||||||
token_type: string;
|
|
||||||
expires_in: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface UserProfile {
|
|
||||||
id: string;
|
|
||||||
email: string;
|
|
||||||
full_name: string;
|
|
||||||
is_active: boolean;
|
|
||||||
is_verified: boolean;
|
|
||||||
tenant_id?: string;
|
|
||||||
role: string;
|
|
||||||
phone?: string;
|
|
||||||
language: string;
|
|
||||||
timezone: string;
|
|
||||||
created_at?: string;
|
|
||||||
last_login?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Tenant types
|
|
||||||
export interface TenantInfo {
|
|
||||||
id: string;
|
|
||||||
name: string;
|
|
||||||
email: string;
|
|
||||||
phone: string;
|
|
||||||
address: string;
|
|
||||||
latitude: number;
|
|
||||||
longitude: number;
|
|
||||||
business_type: string;
|
|
||||||
is_active: boolean;
|
|
||||||
created_at: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Sales types
|
|
||||||
export interface SalesRecord {
|
|
||||||
id: string;
|
|
||||||
tenant_id: string;
|
|
||||||
product_name: string;
|
|
||||||
quantity_sold: number;
|
|
||||||
revenue: number;
|
|
||||||
date: string;
|
|
||||||
created_at: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface CreateSalesRequest {
|
|
||||||
product_name: string;
|
|
||||||
quantity_sold: number;
|
|
||||||
revenue: number;
|
|
||||||
date: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Training types
|
|
||||||
export interface TrainingJobStatus {
|
|
||||||
id: string;
|
|
||||||
tenant_id: string;
|
|
||||||
status: 'queued' | 'running' | 'completed' | 'failed' | 'cancelled';
|
|
||||||
progress: number;
|
|
||||||
current_step?: string;
|
|
||||||
started_at: string;
|
|
||||||
completed_at?: string;
|
|
||||||
duration_seconds?: number;
|
|
||||||
models_trained?: Record<string, any>;
|
|
||||||
metrics?: Record<string, any>;
|
|
||||||
error_message?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface TrainingRequest {
|
|
||||||
force_retrain?: boolean;
|
|
||||||
products?: string[];
|
|
||||||
training_days?: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface TrainedModel {
|
|
||||||
id: string;
|
|
||||||
product_name: string;
|
|
||||||
model_type: string;
|
|
||||||
model_version: string;
|
|
||||||
mape?: number;
|
|
||||||
rmse?: number;
|
|
||||||
mae?: number;
|
|
||||||
r2_score?: number;
|
|
||||||
training_samples?: number;
|
|
||||||
features_used?: string[];
|
|
||||||
is_active: boolean;
|
|
||||||
created_at: string;
|
|
||||||
last_used_at?: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Forecast types
|
|
||||||
export interface ForecastRecord {
|
|
||||||
id: string;
|
|
||||||
tenant_id: string;
|
|
||||||
product_name: string;
|
|
||||||
forecast_date: string;
|
|
||||||
predicted_quantity: number;
|
|
||||||
confidence_lower: number;
|
|
||||||
confidence_upper: number;
|
|
||||||
model_version: string;
|
|
||||||
created_at: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface ForecastRequest {
|
|
||||||
product_name?: string;
|
|
||||||
forecast_days?: number;
|
|
||||||
include_confidence?: boolean;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Data types
|
|
||||||
export interface WeatherData {
|
|
||||||
date: string;
|
|
||||||
temperature: number;
|
|
||||||
humidity: number;
|
|
||||||
precipitation: number;
|
|
||||||
wind_speed: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
export interface TrafficData {
|
|
||||||
date: string;
|
|
||||||
traffic_volume: number;
|
|
||||||
pedestrian_count: number;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Notification types
|
|
||||||
export interface NotificationSettings {
|
|
||||||
email_enabled: boolean;
|
|
||||||
whatsapp_enabled: boolean;
|
|
||||||
training_notifications: boolean;
|
|
||||||
forecast_notifications: boolean;
|
|
||||||
alert_thresholds: {
|
|
||||||
low_stock_percentage: number;
|
|
||||||
high_demand_increase: number;
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|||||||
Reference in New Issue
Block a user