411 lines
11 KiB
JavaScript
411 lines
11 KiB
JavaScript
import { ref } from "vue";
|
|
|
|
export const useNotificationDelivery = () => {
|
|
const isLoading = ref(false);
|
|
const error = ref(null);
|
|
const deliveryStats = ref(null);
|
|
const emailConfig = ref(null);
|
|
const pushConfig = ref(null);
|
|
const smsConfig = ref(null);
|
|
const deliverySettings = ref(null);
|
|
const deliveryProviders = ref([]);
|
|
const deliveryMetrics = ref({
|
|
sent: 0,
|
|
delivered: 0,
|
|
failed: 0,
|
|
pending: 0
|
|
});
|
|
|
|
// Reset error state
|
|
const resetError = () => {
|
|
error.value = null;
|
|
};
|
|
|
|
// Fetch delivery statistics
|
|
const fetchDeliveryStats = async () => {
|
|
isLoading.value = true;
|
|
error.value = null;
|
|
|
|
try {
|
|
const response = await $fetch("/api/notifications/delivery/stats");
|
|
|
|
if (response.success) {
|
|
deliveryStats.value = response.data;
|
|
|
|
// Update metrics from stats
|
|
deliveryMetrics.value = {
|
|
sent: response.data.totalSent || 0,
|
|
delivered: response.data.totalDelivered || 0,
|
|
failed: response.data.totalFailed || 0,
|
|
pending: response.data.totalPending || 0
|
|
};
|
|
|
|
return response.data;
|
|
} else {
|
|
throw new Error(response.message || "Failed to fetch delivery stats");
|
|
}
|
|
} catch (err) {
|
|
error.value = err.data?.message || err.message || "Failed to fetch delivery stats";
|
|
throw error.value;
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
};
|
|
|
|
// Fetch email configuration
|
|
const fetchEmailConfig = async () => {
|
|
isLoading.value = true;
|
|
error.value = null;
|
|
|
|
try {
|
|
const response = await $fetch("/api/notifications/delivery/email-config");
|
|
|
|
if (response.success) {
|
|
emailConfig.value = response.data;
|
|
return response.data;
|
|
} else {
|
|
throw new Error(response.message || "Failed to fetch email configuration");
|
|
}
|
|
} catch (err) {
|
|
error.value = err.data?.message || err.message || "Failed to fetch email configuration";
|
|
throw error.value;
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
};
|
|
|
|
// Fetch push notification configuration
|
|
const fetchPushConfig = async () => {
|
|
isLoading.value = true;
|
|
error.value = null;
|
|
|
|
try {
|
|
const response = await $fetch("/api/notifications/delivery/push-config");
|
|
|
|
if (response.success) {
|
|
pushConfig.value = response.data;
|
|
return response.data;
|
|
} else {
|
|
throw new Error(response.message || "Failed to fetch push configuration");
|
|
}
|
|
} catch (err) {
|
|
error.value = err.data?.message || err.message || "Failed to fetch push configuration";
|
|
throw error.value;
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
};
|
|
|
|
// Fetch SMS configuration
|
|
const fetchSmsConfig = async () => {
|
|
isLoading.value = true;
|
|
error.value = null;
|
|
|
|
try {
|
|
const response = await $fetch("/api/notifications/delivery/sms-config");
|
|
|
|
if (response.success) {
|
|
smsConfig.value = response.data;
|
|
return response.data;
|
|
} else {
|
|
throw new Error(response.message || "Failed to fetch SMS configuration");
|
|
}
|
|
} catch (err) {
|
|
error.value = err.data?.message || err.message || "Failed to fetch SMS configuration";
|
|
throw error.value;
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
};
|
|
|
|
// Fetch delivery settings
|
|
const fetchDeliverySettings = async () => {
|
|
isLoading.value = true;
|
|
error.value = null;
|
|
|
|
try {
|
|
const response = await $fetch("/api/notifications/delivery/settings");
|
|
|
|
if (response.success) {
|
|
deliverySettings.value = response.data;
|
|
return response.data;
|
|
} else {
|
|
throw new Error(response.message || "Failed to fetch delivery settings");
|
|
}
|
|
} catch (err) {
|
|
error.value = err.data?.message || err.message || "Failed to fetch delivery settings";
|
|
throw error.value;
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
};
|
|
|
|
// Fetch all delivery providers
|
|
const fetchDeliveryProviders = async () => {
|
|
isLoading.value = true;
|
|
error.value = null;
|
|
|
|
try {
|
|
const response = await $fetch("/api/notifications/delivery/providers");
|
|
|
|
if (response.success) {
|
|
deliveryProviders.value = response.data;
|
|
return response.data;
|
|
} else {
|
|
throw new Error(response.message || "Failed to fetch delivery providers");
|
|
}
|
|
} catch (err) {
|
|
error.value = err.data?.message || err.message || "Failed to fetch delivery providers";
|
|
throw error.value;
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
};
|
|
|
|
// Fetch delivery performance metrics
|
|
const fetchDeliveryPerformance = async (period = 'last_30_days') => {
|
|
isLoading.value = true;
|
|
error.value = null;
|
|
|
|
try {
|
|
const response = await $fetch(`/api/notifications/delivery/performance?period=${period}`);
|
|
|
|
if (response.success) {
|
|
return response.data;
|
|
} else {
|
|
throw new Error(response.message || "Failed to fetch delivery performance");
|
|
}
|
|
} catch (err) {
|
|
error.value = err.data?.message || err.message || "Failed to fetch delivery performance";
|
|
throw error.value;
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
};
|
|
|
|
// Test delivery configuration
|
|
const testDeliveryConfig = async (channel, config) => {
|
|
isLoading.value = true;
|
|
error.value = null;
|
|
|
|
try {
|
|
const response = await $fetch("/api/notifications/delivery/test", {
|
|
method: "POST",
|
|
body: {
|
|
channel,
|
|
config
|
|
}
|
|
});
|
|
|
|
if (response.success) {
|
|
return {
|
|
success: true,
|
|
message: response.message || "Test successful"
|
|
};
|
|
} else {
|
|
throw new Error(response.message || `Failed to test ${channel} configuration`);
|
|
}
|
|
} catch (err) {
|
|
error.value = err.data?.message || err.message || `Failed to test ${channel} configuration`;
|
|
throw error.value;
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
};
|
|
|
|
// Update email configuration
|
|
const updateEmailConfig = async (config) => {
|
|
isLoading.value = true;
|
|
error.value = null;
|
|
|
|
try {
|
|
const response = await $fetch("/api/notifications/delivery/email-config", {
|
|
method: "PUT",
|
|
body: config,
|
|
});
|
|
|
|
if (response.success) {
|
|
// Update local state
|
|
emailConfig.value = response.data;
|
|
return response.data;
|
|
} else {
|
|
throw new Error(response.message || "Failed to update email configuration");
|
|
}
|
|
} catch (err) {
|
|
error.value = err.data?.message || err.message || "Failed to update email configuration";
|
|
throw error.value;
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
};
|
|
|
|
// Update push notification configuration
|
|
const updatePushConfig = async (config) => {
|
|
isLoading.value = true;
|
|
error.value = null;
|
|
|
|
try {
|
|
const response = await $fetch("/api/notifications/delivery/push-config", {
|
|
method: "PUT",
|
|
body: config,
|
|
});
|
|
|
|
if (response.success) {
|
|
// Update local state
|
|
pushConfig.value = response.data;
|
|
return response.data;
|
|
} else {
|
|
throw new Error(response.message || "Failed to update push configuration");
|
|
}
|
|
} catch (err) {
|
|
error.value = err.data?.message || err.message || "Failed to update push configuration";
|
|
throw error.value;
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
};
|
|
|
|
// Update SMS configuration
|
|
const updateSmsConfig = async (config) => {
|
|
isLoading.value = true;
|
|
error.value = null;
|
|
|
|
try {
|
|
const response = await $fetch("/api/notifications/delivery/sms-config", {
|
|
method: "PUT",
|
|
body: config,
|
|
});
|
|
|
|
if (response.success) {
|
|
// Update local state
|
|
smsConfig.value = response.data;
|
|
return response.data;
|
|
} else {
|
|
throw new Error(response.message || "Failed to update SMS configuration");
|
|
}
|
|
} catch (err) {
|
|
error.value = err.data?.message || err.message || "Failed to update SMS configuration";
|
|
throw error.value;
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
};
|
|
|
|
// Update delivery settings
|
|
const updateDeliverySettings = async (settings) => {
|
|
isLoading.value = true;
|
|
error.value = null;
|
|
|
|
try {
|
|
const response = await $fetch("/api/notifications/delivery/settings", {
|
|
method: "PUT",
|
|
body: settings,
|
|
});
|
|
|
|
if (response.success) {
|
|
// Update local state
|
|
deliverySettings.value = response.data;
|
|
return response.data;
|
|
} else {
|
|
throw new Error(response.message || "Failed to update delivery settings");
|
|
}
|
|
} catch (err) {
|
|
error.value = err.data?.message || err.message || "Failed to update delivery settings";
|
|
throw error.value;
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
};
|
|
|
|
// Retry failed deliveries
|
|
const retryFailedDeliveries = async (notificationId = null) => {
|
|
isLoading.value = true;
|
|
error.value = null;
|
|
|
|
try {
|
|
const endpoint = notificationId
|
|
? `/api/notifications/delivery/retry/${notificationId}`
|
|
: "/api/notifications/delivery/retry";
|
|
|
|
const response = await $fetch(endpoint, {
|
|
method: "POST"
|
|
});
|
|
|
|
if (response.success) {
|
|
return {
|
|
success: true,
|
|
message: response.message || "Retry initiated successfully",
|
|
data: response.data
|
|
};
|
|
} else {
|
|
throw new Error(response.message || "Failed to retry deliveries");
|
|
}
|
|
} catch (err) {
|
|
error.value = err.data?.message || err.message || "Failed to retry deliveries";
|
|
throw error.value;
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
};
|
|
|
|
// Fetch delivery logs
|
|
const fetchDeliveryLogs = async (params = {}) => {
|
|
isLoading.value = true;
|
|
error.value = null;
|
|
|
|
try {
|
|
const queryString = new URLSearchParams();
|
|
|
|
if (params.page) queryString.append("page", params.page);
|
|
if (params.limit) queryString.append("limit", params.limit);
|
|
if (params.status) queryString.append("status", params.status);
|
|
if (params.channel) queryString.append("channel", params.channel);
|
|
if (params.notificationId) queryString.append("notificationId", params.notificationId);
|
|
if (params.startDate) queryString.append("startDate", params.startDate);
|
|
if (params.endDate) queryString.append("endDate", params.endDate);
|
|
|
|
const response = await $fetch(`/api/notifications/delivery/logs?${queryString.toString()}`);
|
|
|
|
if (response.success) {
|
|
return response.data;
|
|
} else {
|
|
throw new Error(response.message || "Failed to fetch delivery logs");
|
|
}
|
|
} catch (err) {
|
|
error.value = err.data?.message || err.message || "Failed to fetch delivery logs";
|
|
throw error.value;
|
|
} finally {
|
|
isLoading.value = false;
|
|
}
|
|
};
|
|
|
|
return {
|
|
// State
|
|
isLoading,
|
|
error,
|
|
deliveryStats,
|
|
emailConfig,
|
|
pushConfig,
|
|
smsConfig,
|
|
deliverySettings,
|
|
deliveryProviders,
|
|
deliveryMetrics,
|
|
|
|
// Methods
|
|
resetError,
|
|
fetchDeliveryStats,
|
|
fetchEmailConfig,
|
|
fetchPushConfig,
|
|
fetchSmsConfig,
|
|
fetchDeliverySettings,
|
|
fetchDeliveryProviders,
|
|
fetchDeliveryPerformance,
|
|
fetchDeliveryLogs,
|
|
testDeliveryConfig,
|
|
updateEmailConfig,
|
|
updatePushConfig,
|
|
updateSmsConfig,
|
|
updateDeliverySettings,
|
|
retryFailedDeliveries
|
|
};
|
|
};
|