Files
Hotel-Booking/Frontend/src/services/api/notificationService.ts
Iliyan Angelov cf97df9aeb updates
2025-11-28 20:24:58 +02:00

131 lines
3.7 KiB
TypeScript

import apiClient from './apiClient';
export interface Notification {
id: number;
user_id?: number;
notification_type: 'booking_confirmation' | 'payment_receipt' | 'pre_arrival_reminder' | 'check_in_reminder' | 'check_out_reminder' | 'marketing_campaign' | 'loyalty_update' | 'system_alert' | 'custom';
channel: 'email' | 'sms' | 'push' | 'whatsapp' | 'in_app';
subject?: string;
content: string;
status: 'pending' | 'sent' | 'delivered' | 'failed' | 'read';
priority: string;
sent_at?: string;
delivered_at?: string;
read_at?: string;
created_at: string;
}
export interface NotificationTemplate {
id: number;
name: string;
notification_type: string;
channel: string;
subject?: string;
content: string;
variables?: string[];
}
export interface NotificationPreferences {
email_enabled: boolean;
sms_enabled: boolean;
push_enabled: boolean;
whatsapp_enabled: boolean;
in_app_enabled: boolean;
booking_confirmation_email: boolean;
booking_confirmation_sms: boolean;
payment_receipt_email: boolean;
payment_receipt_sms: boolean;
pre_arrival_reminder_email: boolean;
pre_arrival_reminder_sms: boolean;
check_in_reminder_email: boolean;
check_in_reminder_sms: boolean;
check_out_reminder_email: boolean;
check_out_reminder_sms: boolean;
marketing_campaign_email: boolean;
marketing_campaign_sms: boolean;
loyalty_update_email: boolean;
loyalty_update_sms: boolean;
system_alert_email: boolean;
system_alert_push: boolean;
}
export interface SendNotificationRequest {
user_id?: number;
notification_type: string;
channel: string;
content: string;
subject?: string;
template_id?: number;
priority?: string;
scheduled_at?: string;
booking_id?: number;
payment_id?: number;
meta_data?: Record<string, any>;
}
const notificationService = {
// Notifications
getNotifications: async (params?: {
user_id?: number;
notification_type?: string;
channel?: string;
status?: string;
skip?: number;
limit?: number;
}) => {
return apiClient.get<{ status: string; data: Notification[] }>('/notifications/', { params });
},
getMyNotifications: async (params?: {
status?: string;
skip?: number;
limit?: number;
}) => {
// Don't make API call if user is not authenticated
const token = localStorage.getItem('token');
if (!token) {
throw new Error('Not authenticated');
}
return apiClient.get<{ status: string; data: Notification[] }>('/notifications/my-notifications', { params });
},
sendNotification: async (data: SendNotificationRequest) => {
return apiClient.post<{ status: string; data: Notification }>('/notifications/send', data);
},
markAsRead: async (notificationId: number) => {
return apiClient.post<{ status: string; data: Notification }>(`/notifications/${notificationId}/read`);
},
// Templates
getTemplates: async (params?: {
notification_type?: string;
channel?: string;
}) => {
return apiClient.get<{ status: string; data: NotificationTemplate[] }>('/notifications/templates', { params });
},
createTemplate: async (data: {
name: string;
notification_type: string;
channel: string;
content: string;
subject?: string;
variables?: string[];
}) => {
return apiClient.post<{ status: string; data: NotificationTemplate }>('/notifications/templates', data);
},
// Preferences
getPreferences: async () => {
return apiClient.get<{ status: string; data: NotificationPreferences }>('/notifications/preferences');
},
updatePreferences: async (data: Partial<NotificationPreferences>) => {
return apiClient.put<{ status: string; data: NotificationPreferences }>('/notifications/preferences', data);
},
};
export default notificationService;