Initial commit: Telegram Management System
Some checks failed
Deploy / deploy (push) Has been cancelled
Some checks failed
Deploy / deploy (push) Has been cancelled
Full-stack web application for Telegram management - Frontend: Vue 3 + Vben Admin - Backend: NestJS - Features: User management, group broadcast, statistics 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
289
marketing-agent/frontend/src/api/billing.js
Normal file
289
marketing-agent/frontend/src/api/billing.js
Normal file
@@ -0,0 +1,289 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
// Subscriptions
|
||||
export function getSubscriptions() {
|
||||
return request({
|
||||
url: '/api/v1/billing/subscriptions',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export function getSubscription(id) {
|
||||
return request({
|
||||
url: `/api/v1/billing/subscriptions/${id}`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export function createSubscription(data) {
|
||||
return request({
|
||||
url: '/api/v1/billing/subscriptions',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function updateSubscription(id, data) {
|
||||
return request({
|
||||
url: `/api/v1/billing/subscriptions/${id}`,
|
||||
method: 'patch',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function cancelSubscription(id, data) {
|
||||
return request({
|
||||
url: `/api/v1/billing/subscriptions/${id}/cancel`,
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function reactivateSubscription(id) {
|
||||
return request({
|
||||
url: `/api/v1/billing/subscriptions/${id}/reactivate`,
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
|
||||
export function recordUsage(id, data) {
|
||||
return request({
|
||||
url: `/api/v1/billing/subscriptions/${id}/usage`,
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function getSubscriptionUsage(id, params) {
|
||||
return request({
|
||||
url: `/api/v1/billing/subscriptions/${id}/usage`,
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
export function applyDiscount(id, data) {
|
||||
return request({
|
||||
url: `/api/v1/billing/subscriptions/${id}/discount`,
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// Invoices
|
||||
export function getInvoices(params) {
|
||||
return request({
|
||||
url: '/api/v1/billing/invoices',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
export function getInvoice(id) {
|
||||
return request({
|
||||
url: `/api/v1/billing/invoices/${id}`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export function createInvoice(data) {
|
||||
return request({
|
||||
url: '/api/v1/billing/invoices',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function updateInvoice(id, data) {
|
||||
return request({
|
||||
url: `/api/v1/billing/invoices/${id}`,
|
||||
method: 'patch',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function finalizeInvoice(id) {
|
||||
return request({
|
||||
url: `/api/v1/billing/invoices/${id}/finalize`,
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
|
||||
export function payInvoice(id, data) {
|
||||
return request({
|
||||
url: `/api/v1/billing/invoices/${id}/pay`,
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function voidInvoice(id, data) {
|
||||
return request({
|
||||
url: `/api/v1/billing/invoices/${id}/void`,
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function downloadInvoice(id) {
|
||||
return request({
|
||||
url: `/api/v1/billing/invoices/${id}/pdf`,
|
||||
method: 'get',
|
||||
responseType: 'blob'
|
||||
})
|
||||
}
|
||||
|
||||
export function sendInvoiceReminder(id) {
|
||||
return request({
|
||||
url: `/api/v1/billing/invoices/${id}/remind`,
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
|
||||
export function getUnpaidInvoices() {
|
||||
return request({
|
||||
url: '/api/v1/billing/invoices/unpaid',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export function getOverdueInvoices() {
|
||||
return request({
|
||||
url: '/api/v1/billing/invoices/overdue',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// Payment Methods
|
||||
export function getPaymentMethods() {
|
||||
return request({
|
||||
url: '/api/v1/billing/payment-methods',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export function getPaymentMethod(id) {
|
||||
return request({
|
||||
url: `/api/v1/billing/payment-methods/${id}`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export function addPaymentMethod(data) {
|
||||
return request({
|
||||
url: '/api/v1/billing/payment-methods',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function updatePaymentMethod(id, data) {
|
||||
return request({
|
||||
url: `/api/v1/billing/payment-methods/${id}`,
|
||||
method: 'patch',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function setDefaultPaymentMethod(id) {
|
||||
return request({
|
||||
url: `/api/v1/billing/payment-methods/${id}/default`,
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
|
||||
export function removePaymentMethod(id) {
|
||||
return request({
|
||||
url: `/api/v1/billing/payment-methods/${id}`,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
|
||||
export function verifyPaymentMethod(id, data) {
|
||||
return request({
|
||||
url: `/api/v1/billing/payment-methods/${id}/verify`,
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// Transactions
|
||||
export function getTransactions(params) {
|
||||
return request({
|
||||
url: '/api/v1/billing/transactions',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
export function getTransaction(id) {
|
||||
return request({
|
||||
url: `/api/v1/billing/transactions/${id}`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export function createRefund(id, data) {
|
||||
return request({
|
||||
url: `/api/v1/billing/transactions/${id}/refund`,
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
export function getTransactionSummary(period, params) {
|
||||
return request({
|
||||
url: `/api/v1/billing/transactions/summary/${period}`,
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
export function exportTransactions(format, params) {
|
||||
return request({
|
||||
url: `/api/v1/billing/transactions/export/${format}`,
|
||||
method: 'get',
|
||||
params,
|
||||
responseType: 'blob'
|
||||
})
|
||||
}
|
||||
|
||||
export function createAdjustment(data) {
|
||||
return request({
|
||||
url: '/api/v1/billing/transactions/adjustment',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
|
||||
// Plans
|
||||
export function getPlans() {
|
||||
return request({
|
||||
url: '/api/v1/billing/plans',
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
export function getPlan(id) {
|
||||
return request({
|
||||
url: `/api/v1/billing/plans/${id}`,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
|
||||
// Coupons
|
||||
export function validateCoupon(code) {
|
||||
return request({
|
||||
url: '/api/v1/billing/coupons/validate',
|
||||
method: 'post',
|
||||
data: { code }
|
||||
})
|
||||
}
|
||||
|
||||
// Stripe Customer Portal
|
||||
export function createCustomerPortalSession() {
|
||||
return request({
|
||||
url: '/api/v1/billing/customer-portal',
|
||||
method: 'post'
|
||||
})
|
||||
}
|
||||
102
marketing-agent/frontend/src/api/index.js
Normal file
102
marketing-agent/frontend/src/api/index.js
Normal file
@@ -0,0 +1,102 @@
|
||||
import axios from 'axios'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import router from '@/router'
|
||||
|
||||
// Create axios instance
|
||||
const request = axios.create({
|
||||
baseURL: '/api/v1',
|
||||
timeout: 30000,
|
||||
headers: {
|
||||
'Content-Type': 'application/json'
|
||||
}
|
||||
})
|
||||
|
||||
// Request interceptor
|
||||
request.interceptors.request.use(
|
||||
config => {
|
||||
const token = localStorage.getItem('token')
|
||||
if (token) {
|
||||
config.headers.Authorization = `Bearer ${token}`
|
||||
}
|
||||
return config
|
||||
},
|
||||
error => {
|
||||
console.error('Request error:', error)
|
||||
return Promise.reject(error)
|
||||
}
|
||||
)
|
||||
|
||||
// Response interceptor
|
||||
request.interceptors.response.use(
|
||||
response => {
|
||||
console.log('API Response:', response.config.url, response.data)
|
||||
return response
|
||||
},
|
||||
error => {
|
||||
if (error.response) {
|
||||
switch (error.response.status) {
|
||||
case 401:
|
||||
localStorage.removeItem('token')
|
||||
router.push({ name: 'Login' })
|
||||
ElMessage.error('Authentication expired, please login again')
|
||||
break
|
||||
case 403:
|
||||
ElMessage.error('Access denied')
|
||||
break
|
||||
case 404:
|
||||
ElMessage.error('Resource not found')
|
||||
break
|
||||
case 429:
|
||||
ElMessage.error('Too many requests, please try again later')
|
||||
break
|
||||
case 500:
|
||||
ElMessage.error('Server error, please try again later')
|
||||
break
|
||||
default:
|
||||
ElMessage.error(error.response.data?.error || 'Operation failed')
|
||||
}
|
||||
} else if (error.request) {
|
||||
ElMessage.error('Network error, please check your connection')
|
||||
} else {
|
||||
ElMessage.error('Request failed')
|
||||
}
|
||||
return Promise.reject(error)
|
||||
}
|
||||
)
|
||||
|
||||
// API modules
|
||||
import auth from './modules/auth'
|
||||
import campaigns from './modules/campaigns'
|
||||
import analytics from './modules/analytics'
|
||||
import abTesting from './modules/abTesting'
|
||||
import accounts from './modules/accounts'
|
||||
import compliance from './modules/compliance'
|
||||
import ai from './modules/ai'
|
||||
import settings from './modules/settings'
|
||||
import scheduledCampaigns from './modules/scheduledCampaigns'
|
||||
import segments from './modules/segments'
|
||||
import templates from './modules/templates'
|
||||
|
||||
const api = {
|
||||
auth,
|
||||
campaigns,
|
||||
analytics,
|
||||
abTesting,
|
||||
accounts,
|
||||
compliance,
|
||||
ai,
|
||||
settings,
|
||||
scheduledCampaigns,
|
||||
segments,
|
||||
templates,
|
||||
setAuthToken(token) {
|
||||
if (token) {
|
||||
request.defaults.headers.common['Authorization'] = `Bearer ${token}`
|
||||
} else {
|
||||
delete request.defaults.headers.common['Authorization']
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
export { request }
|
||||
export default api
|
||||
71
marketing-agent/frontend/src/api/modules/abTesting.js
Normal file
71
marketing-agent/frontend/src/api/modules/abTesting.js
Normal file
@@ -0,0 +1,71 @@
|
||||
import { request } from '../index'
|
||||
|
||||
export default {
|
||||
// Experiments
|
||||
getExperiments(params) {
|
||||
return request.get('/ab-testing/experiments', { params })
|
||||
},
|
||||
|
||||
getExperiment(id) {
|
||||
return request.get(`/ab-testing/experiments/${id}`)
|
||||
},
|
||||
|
||||
createExperiment(data) {
|
||||
return request.post('/ab-testing/experiments', data)
|
||||
},
|
||||
|
||||
updateExperiment(id, data) {
|
||||
return request.put(`/ab-testing/experiments/${id}`, data)
|
||||
},
|
||||
|
||||
deleteExperiment(id) {
|
||||
return request.delete(`/ab-testing/experiments/${id}`)
|
||||
},
|
||||
|
||||
// Experiment actions
|
||||
startExperiment(id) {
|
||||
return request.post(`/ab-testing/experiments/${id}/start`)
|
||||
},
|
||||
|
||||
pauseExperiment(id) {
|
||||
return request.post(`/ab-testing/experiments/${id}/pause`)
|
||||
},
|
||||
|
||||
stopExperiment(id) {
|
||||
return request.post(`/ab-testing/experiments/${id}/stop`)
|
||||
},
|
||||
|
||||
// Variants
|
||||
getVariants(experimentId) {
|
||||
return request.get(`/ab-testing/experiments/${experimentId}/variants`)
|
||||
},
|
||||
|
||||
createVariant(experimentId, data) {
|
||||
return request.post(`/ab-testing/experiments/${experimentId}/variants`, data)
|
||||
},
|
||||
|
||||
updateVariant(experimentId, variantId, data) {
|
||||
return request.put(`/ab-testing/experiments/${experimentId}/variants/${variantId}`, data)
|
||||
},
|
||||
|
||||
deleteVariant(experimentId, variantId) {
|
||||
return request.delete(`/ab-testing/experiments/${experimentId}/variants/${variantId}`)
|
||||
},
|
||||
|
||||
// Results
|
||||
getResults(experimentId) {
|
||||
return request.get(`/ab-testing/experiments/${experimentId}/results`)
|
||||
},
|
||||
|
||||
// Significance test
|
||||
runSignificanceTest(experimentId) {
|
||||
return request.post(`/ab-testing/experiments/${experimentId}/significance-test`)
|
||||
},
|
||||
|
||||
// Winner selection
|
||||
selectWinner(experimentId, variantId) {
|
||||
return request.post(`/ab-testing/experiments/${experimentId}/select-winner`, {
|
||||
variantId
|
||||
})
|
||||
}
|
||||
}
|
||||
104
marketing-agent/frontend/src/api/modules/accounts.js
Normal file
104
marketing-agent/frontend/src/api/modules/accounts.js
Normal file
@@ -0,0 +1,104 @@
|
||||
import { request } from '../index'
|
||||
|
||||
export default {
|
||||
// Get accounts list
|
||||
getList(params) {
|
||||
return request.get('/accounts', { params })
|
||||
},
|
||||
|
||||
// Telegram accounts
|
||||
getAccounts(params) {
|
||||
return request.get('/gramjs-adapter/accounts', { params })
|
||||
},
|
||||
|
||||
// Connect new Telegram account
|
||||
connectAccount(data) {
|
||||
return request.post('/gramjs-adapter/accounts/connect', data)
|
||||
},
|
||||
|
||||
// Verify account with code
|
||||
verifyAccount(accountId, data) {
|
||||
return request.post(`/gramjs-adapter/accounts/${accountId}/verify`, data)
|
||||
},
|
||||
|
||||
// Get account connection status
|
||||
getAccountStatus(accountId) {
|
||||
return request.get(`/gramjs-adapter/accounts/${accountId}/status`)
|
||||
},
|
||||
|
||||
// Disconnect account
|
||||
disconnectAccount(accountId) {
|
||||
return request.delete(`/gramjs-adapter/accounts/${accountId}`)
|
||||
},
|
||||
|
||||
// Reconnect account
|
||||
reconnectAccount(accountId) {
|
||||
return request.post(`/gramjs-adapter/accounts/${accountId}/reconnect`)
|
||||
},
|
||||
|
||||
getAccount(id) {
|
||||
return request.get(`/accounts/${id}`)
|
||||
},
|
||||
|
||||
addAccount(data) {
|
||||
return request.post('/accounts', data)
|
||||
},
|
||||
|
||||
updateAccount(id, data) {
|
||||
return request.put(`/accounts/${id}`, data)
|
||||
},
|
||||
|
||||
deleteAccount(id) {
|
||||
return request.delete(`/accounts/${id}`)
|
||||
},
|
||||
|
||||
// Update account status
|
||||
updateStatus(id, status) {
|
||||
return request.put(`/accounts/${id}/status`, { status })
|
||||
},
|
||||
|
||||
// Account actions
|
||||
activateAccount(id) {
|
||||
return request.post(`/accounts/${id}/activate`)
|
||||
},
|
||||
|
||||
deactivateAccount(id) {
|
||||
return request.post(`/accounts/${id}/deactivate`)
|
||||
},
|
||||
|
||||
refreshSession(id) {
|
||||
return request.post(`/accounts/${id}/refresh-session`)
|
||||
},
|
||||
|
||||
// Groups
|
||||
getGroups(params) {
|
||||
return request.get('/groups', { params })
|
||||
},
|
||||
|
||||
getGroup(id) {
|
||||
return request.get(`/groups/${id}`)
|
||||
},
|
||||
|
||||
syncGroups(accountId) {
|
||||
return request.post(`/accounts/${accountId}/sync-groups`)
|
||||
},
|
||||
|
||||
// Group members
|
||||
getGroupMembers(groupId, params) {
|
||||
return request.get(`/groups/${groupId}/members`, { params })
|
||||
},
|
||||
|
||||
// Account statistics
|
||||
getAccountStats(id) {
|
||||
return request.get(`/accounts/${id}/stats`)
|
||||
},
|
||||
|
||||
// Batch operations
|
||||
batchActivate(accountIds) {
|
||||
return request.post('/accounts/batch/activate', { accountIds })
|
||||
},
|
||||
|
||||
batchDeactivate(accountIds) {
|
||||
return request.post('/accounts/batch/deactivate', { accountIds })
|
||||
}
|
||||
}
|
||||
50
marketing-agent/frontend/src/api/modules/ai.js
Normal file
50
marketing-agent/frontend/src/api/modules/ai.js
Normal file
@@ -0,0 +1,50 @@
|
||||
import { request } from '../index'
|
||||
|
||||
export default {
|
||||
// Strategy generation
|
||||
generateStrategy(data) {
|
||||
return request.post('/claude/strategy/generate', data)
|
||||
},
|
||||
|
||||
// Campaign analysis
|
||||
analyzeCampaign(data) {
|
||||
return request.post('/claude/analysis/campaign', data)
|
||||
},
|
||||
|
||||
// Content generation
|
||||
generateContent(data) {
|
||||
return request.post('/claude/content/generate', data)
|
||||
},
|
||||
|
||||
optimizeContent(data) {
|
||||
return request.post('/claude/content/optimize', data)
|
||||
},
|
||||
|
||||
// Audience analysis
|
||||
analyzeAudience(data) {
|
||||
return request.post('/claude/analysis/audience', data)
|
||||
},
|
||||
|
||||
// Predictions
|
||||
predictPerformance(data) {
|
||||
return request.post('/claude/predict/performance', data)
|
||||
},
|
||||
|
||||
predictEngagement(data) {
|
||||
return request.post('/claude/predict/engagement', data)
|
||||
},
|
||||
|
||||
// Recommendations
|
||||
getRecommendations(type, params) {
|
||||
return request.get(`/claude/recommendations/${type}`, { params })
|
||||
},
|
||||
|
||||
// Chat interface
|
||||
sendMessage(data) {
|
||||
return request.post('/claude/chat', data)
|
||||
},
|
||||
|
||||
getChatHistory(sessionId) {
|
||||
return request.get(`/claude/chat/history/${sessionId}`)
|
||||
}
|
||||
}
|
||||
63
marketing-agent/frontend/src/api/modules/analytics.js
Normal file
63
marketing-agent/frontend/src/api/modules/analytics.js
Normal file
@@ -0,0 +1,63 @@
|
||||
import { request } from '../index'
|
||||
|
||||
export default {
|
||||
// Dashboard metrics
|
||||
getDashboardMetrics(params) {
|
||||
return request.get('/analytics/dashboard', { params })
|
||||
},
|
||||
|
||||
// Campaign analytics
|
||||
getCampaignMetrics(campaignId, params) {
|
||||
return request.get(`/analytics/campaigns/${campaignId}/metrics`, { params })
|
||||
},
|
||||
|
||||
// Message analytics
|
||||
getMessageMetrics(params) {
|
||||
return request.get('/analytics/messages', { params })
|
||||
},
|
||||
|
||||
// Engagement analytics
|
||||
getEngagementMetrics(params) {
|
||||
return request.get('/analytics/engagement', { params })
|
||||
},
|
||||
|
||||
// Conversion analytics
|
||||
getConversionMetrics(params) {
|
||||
return request.get('/analytics/conversions', { params })
|
||||
},
|
||||
|
||||
// Real-time analytics
|
||||
getRealTimeMetrics() {
|
||||
return request.get('/analytics/realtime')
|
||||
},
|
||||
|
||||
// Reports
|
||||
generateReport(data) {
|
||||
return request.post('/analytics/reports', data)
|
||||
},
|
||||
|
||||
getReports(params) {
|
||||
return request.get('/analytics/reports', { params })
|
||||
},
|
||||
|
||||
downloadReport(id) {
|
||||
return request.get(`/analytics/reports/${id}/download`, {
|
||||
responseType: 'blob'
|
||||
})
|
||||
},
|
||||
|
||||
// Custom metrics
|
||||
trackEvent(data) {
|
||||
return request.post('/analytics/events', data)
|
||||
},
|
||||
|
||||
// Funnel analytics
|
||||
getFunnelMetrics(params) {
|
||||
return request.get('/analytics/funnel', { params })
|
||||
},
|
||||
|
||||
// Cohort analytics
|
||||
getCohortAnalysis(params) {
|
||||
return request.get('/analytics/cohorts', { params })
|
||||
}
|
||||
}
|
||||
40
marketing-agent/frontend/src/api/modules/auth.js
Normal file
40
marketing-agent/frontend/src/api/modules/auth.js
Normal file
@@ -0,0 +1,40 @@
|
||||
import { request } from '../index'
|
||||
|
||||
export default {
|
||||
login(data) {
|
||||
return request.post('/auth/login', data)
|
||||
},
|
||||
|
||||
register(data) {
|
||||
return request.post('/auth/register', data)
|
||||
},
|
||||
|
||||
logout() {
|
||||
return request.post('/auth/logout')
|
||||
},
|
||||
|
||||
getProfile() {
|
||||
return request.get('/auth/me')
|
||||
},
|
||||
|
||||
updateProfile(data) {
|
||||
return request.put('/auth/profile', data)
|
||||
},
|
||||
|
||||
changePassword(data) {
|
||||
return request.post('/auth/change-password', data)
|
||||
},
|
||||
|
||||
// API Key management
|
||||
getApiKeys() {
|
||||
return request.get('/auth/api-keys')
|
||||
},
|
||||
|
||||
createApiKey(data) {
|
||||
return request.post('/auth/api-keys', data)
|
||||
},
|
||||
|
||||
deleteApiKey(id) {
|
||||
return request.delete(`/auth/api-keys/${id}`)
|
||||
}
|
||||
}
|
||||
85
marketing-agent/frontend/src/api/modules/campaigns.js
Normal file
85
marketing-agent/frontend/src/api/modules/campaigns.js
Normal file
@@ -0,0 +1,85 @@
|
||||
import { request } from '../index'
|
||||
|
||||
export default {
|
||||
// Campaign CRUD
|
||||
getList(params) {
|
||||
return request.get('/orchestrator/campaigns', { params })
|
||||
},
|
||||
|
||||
getDetail(id) {
|
||||
return request.get(`/orchestrator/campaigns/${id}`)
|
||||
},
|
||||
|
||||
create(data) {
|
||||
return request.post('/orchestrator/campaigns', data)
|
||||
},
|
||||
|
||||
update(id, data) {
|
||||
return request.put(`/orchestrator/campaigns/${id}`, data)
|
||||
},
|
||||
|
||||
delete(id) {
|
||||
return request.delete(`/orchestrator/campaigns/${id}`)
|
||||
},
|
||||
|
||||
// Campaign actions
|
||||
execute(id) {
|
||||
return request.post(`/orchestrator/campaigns/${id}/execute`)
|
||||
},
|
||||
|
||||
pause(id) {
|
||||
return request.post(`/orchestrator/campaigns/${id}/pause`)
|
||||
},
|
||||
|
||||
resume(id) {
|
||||
return request.post(`/orchestrator/campaigns/${id}/resume`)
|
||||
},
|
||||
|
||||
cancel(id) {
|
||||
return request.post(`/orchestrator/campaigns/${id}/cancel`)
|
||||
},
|
||||
|
||||
clone(id) {
|
||||
return request.post(`/orchestrator/campaigns/${id}/clone`)
|
||||
},
|
||||
|
||||
// Campaign progress
|
||||
getProgress(id) {
|
||||
return request.get(`/orchestrator/campaigns/${id}/progress`)
|
||||
},
|
||||
|
||||
// Campaign statistics
|
||||
getStatistics(id) {
|
||||
return request.get(`/orchestrator/campaigns/${id}/statistics`)
|
||||
},
|
||||
|
||||
// Campaign messages
|
||||
getMessages(id, params) {
|
||||
return request.get(`/orchestrator/campaigns/${id}/messages`, { params })
|
||||
},
|
||||
|
||||
// Message templates
|
||||
getTemplates() {
|
||||
return request.get('/orchestrator/messages/templates')
|
||||
},
|
||||
|
||||
getTemplate(id) {
|
||||
return request.get(`/orchestrator/messages/templates/${id}`)
|
||||
},
|
||||
|
||||
createTemplate(data) {
|
||||
return request.post('/orchestrator/messages/templates', data)
|
||||
},
|
||||
|
||||
updateTemplate(id, data) {
|
||||
return request.put(`/orchestrator/messages/templates/${id}`, data)
|
||||
},
|
||||
|
||||
deleteTemplate(id) {
|
||||
return request.delete(`/orchestrator/messages/templates/${id}`)
|
||||
},
|
||||
|
||||
previewTemplate(id, variables) {
|
||||
return request.post(`/orchestrator/messages/templates/${id}/preview`, { variables })
|
||||
}
|
||||
}
|
||||
71
marketing-agent/frontend/src/api/modules/compliance.js
Normal file
71
marketing-agent/frontend/src/api/modules/compliance.js
Normal file
@@ -0,0 +1,71 @@
|
||||
import { request } from '../index'
|
||||
|
||||
export default {
|
||||
// Consent management
|
||||
getConsent(userId) {
|
||||
return request.get(`/compliance/consent/${userId}`)
|
||||
},
|
||||
|
||||
updateConsent(userId, data) {
|
||||
return request.put(`/compliance/consent/${userId}`, data)
|
||||
},
|
||||
|
||||
recordConsent(data) {
|
||||
return request.post('/compliance/consent/record', data)
|
||||
},
|
||||
|
||||
// Privacy rights
|
||||
requestDataExport(userId) {
|
||||
return request.post('/compliance/privacy/export', { userId })
|
||||
},
|
||||
|
||||
requestDataDeletion(userId, data) {
|
||||
return request.post('/compliance/privacy/delete', {
|
||||
userId,
|
||||
...data
|
||||
})
|
||||
},
|
||||
|
||||
getPrivacyRequests(params) {
|
||||
return request.get('/compliance/privacy/requests', { params })
|
||||
},
|
||||
|
||||
// Audit logs
|
||||
getAuditLogs(params) {
|
||||
return request.get('/compliance/audit/logs', { params })
|
||||
},
|
||||
|
||||
generateComplianceReport(data) {
|
||||
return request.post('/compliance/audit/report', data)
|
||||
},
|
||||
|
||||
// Regulatory compliance
|
||||
getGDPRStatus() {
|
||||
return request.get('/compliance/regulatory/gdpr/status')
|
||||
},
|
||||
|
||||
getCCPAStatus() {
|
||||
return request.get('/compliance/regulatory/ccpa/status')
|
||||
},
|
||||
|
||||
// Data retention
|
||||
getRetentionPolicies() {
|
||||
return request.get('/compliance/retention/policies')
|
||||
},
|
||||
|
||||
updateRetentionPolicy(type, data) {
|
||||
return request.put(`/compliance/retention/policies/${type}`, data)
|
||||
},
|
||||
|
||||
// Do Not Sell
|
||||
getDoNotSellStatus(userId) {
|
||||
return request.get(`/compliance/privacy/donotsell/${userId}`)
|
||||
},
|
||||
|
||||
updateDoNotSellStatus(userId, optOut) {
|
||||
return request.post('/compliance/privacy/donotsell', {
|
||||
userId,
|
||||
optOut
|
||||
})
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,55 @@
|
||||
import { request } from '../index'
|
||||
|
||||
export default {
|
||||
// Get all scheduled campaigns
|
||||
getAll(params) {
|
||||
return request.get('/scheduled-campaigns', { params })
|
||||
},
|
||||
|
||||
// Get scheduled campaign by ID
|
||||
get(id) {
|
||||
return request.get(`/scheduled-campaigns/${id}`)
|
||||
},
|
||||
|
||||
// Create scheduled campaign
|
||||
create(data) {
|
||||
return request.post('/scheduled-campaigns', data)
|
||||
},
|
||||
|
||||
// Update scheduled campaign
|
||||
update(id, data) {
|
||||
return request.put(`/scheduled-campaigns/${id}`, data)
|
||||
},
|
||||
|
||||
// Delete scheduled campaign
|
||||
delete(id) {
|
||||
return request.delete(`/scheduled-campaigns/${id}`)
|
||||
},
|
||||
|
||||
// Get campaign history
|
||||
getHistory(id, limit = 50) {
|
||||
return request.get(`/scheduled-campaigns/${id}/history`, {
|
||||
params: { limit }
|
||||
})
|
||||
},
|
||||
|
||||
// Pause campaign
|
||||
pause(id) {
|
||||
return request.post(`/scheduled-campaigns/${id}/pause`)
|
||||
},
|
||||
|
||||
// Resume campaign
|
||||
resume(id) {
|
||||
return request.post(`/scheduled-campaigns/${id}/resume`)
|
||||
},
|
||||
|
||||
// Test campaign
|
||||
test(id, options) {
|
||||
return request.post(`/scheduled-campaigns/${id}/test`, options)
|
||||
},
|
||||
|
||||
// Get statistics
|
||||
getStatistics(period = '7d') {
|
||||
return request.get(`/scheduled-campaigns/statistics/${period}`)
|
||||
}
|
||||
}
|
||||
55
marketing-agent/frontend/src/api/modules/segments.js
Normal file
55
marketing-agent/frontend/src/api/modules/segments.js
Normal file
@@ -0,0 +1,55 @@
|
||||
import { request } from '../index'
|
||||
|
||||
export default {
|
||||
// Get all segments
|
||||
getAll(params) {
|
||||
return request.get('/segments', { params })
|
||||
},
|
||||
|
||||
// Get segment by ID
|
||||
get(id) {
|
||||
return request.get(`/segments/${id}`)
|
||||
},
|
||||
|
||||
// Create segment
|
||||
create(data) {
|
||||
return request.post('/segments', data)
|
||||
},
|
||||
|
||||
// Update segment
|
||||
update(id, data) {
|
||||
return request.put(`/segments/${id}`, data)
|
||||
},
|
||||
|
||||
// Delete segment
|
||||
delete(id) {
|
||||
return request.delete(`/segments/${id}`)
|
||||
},
|
||||
|
||||
// Test segment
|
||||
test(id) {
|
||||
return request.post(`/segments/${id}/test`)
|
||||
},
|
||||
|
||||
// Get segment users
|
||||
getUsers(id, params) {
|
||||
return request.get(`/segments/${id}/users`, { params })
|
||||
},
|
||||
|
||||
// Export segment users
|
||||
export(id) {
|
||||
return request.get(`/segments/${id}/export`, {
|
||||
responseType: 'blob'
|
||||
})
|
||||
},
|
||||
|
||||
// Clone segment
|
||||
clone(id, data) {
|
||||
return request.post(`/segments/${id}/clone`, data)
|
||||
},
|
||||
|
||||
// Get segment statistics
|
||||
getStats() {
|
||||
return request.get('/segments-stats')
|
||||
}
|
||||
}
|
||||
45
marketing-agent/frontend/src/api/modules/settings.js
Normal file
45
marketing-agent/frontend/src/api/modules/settings.js
Normal file
@@ -0,0 +1,45 @@
|
||||
import request from '../index'
|
||||
|
||||
export default {
|
||||
// Get user settings
|
||||
get() {
|
||||
return request({
|
||||
url: '/settings',
|
||||
method: 'get'
|
||||
})
|
||||
},
|
||||
|
||||
// Update user settings
|
||||
update(data) {
|
||||
return request({
|
||||
url: '/settings',
|
||||
method: 'put',
|
||||
data
|
||||
})
|
||||
},
|
||||
|
||||
// Get API keys
|
||||
getApiKeys() {
|
||||
return request({
|
||||
url: '/settings/api-keys',
|
||||
method: 'get'
|
||||
})
|
||||
},
|
||||
|
||||
// Generate new API key
|
||||
generateApiKey(data) {
|
||||
return request({
|
||||
url: '/settings/api-keys',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
},
|
||||
|
||||
// Delete API key
|
||||
deleteApiKey(id) {
|
||||
return request({
|
||||
url: `/settings/api-keys/${id}`,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
}
|
||||
53
marketing-agent/frontend/src/api/modules/templates.js
Normal file
53
marketing-agent/frontend/src/api/modules/templates.js
Normal file
@@ -0,0 +1,53 @@
|
||||
import { request } from '../index'
|
||||
|
||||
export default {
|
||||
// Get all templates
|
||||
getAll(params) {
|
||||
return request.get('/templates', { params })
|
||||
},
|
||||
|
||||
// Get template by ID
|
||||
get(id) {
|
||||
return request.get(`/templates/${id}`)
|
||||
},
|
||||
|
||||
// Create template
|
||||
create(data) {
|
||||
return request.post('/templates', data)
|
||||
},
|
||||
|
||||
// Update template
|
||||
update(id, data) {
|
||||
return request.put(`/templates/${id}`, data)
|
||||
},
|
||||
|
||||
// Delete template
|
||||
delete(id) {
|
||||
return request.delete(`/templates/${id}`)
|
||||
},
|
||||
|
||||
// Preview template
|
||||
preview(id, data) {
|
||||
return request.post(`/templates/${id}/preview`, data)
|
||||
},
|
||||
|
||||
// Test template
|
||||
test(id, data) {
|
||||
return request.post(`/templates/${id}/test`, data)
|
||||
},
|
||||
|
||||
// Clone template
|
||||
clone(id, data) {
|
||||
return request.post(`/templates/${id}/clone`, data)
|
||||
},
|
||||
|
||||
// Get template categories
|
||||
getCategories() {
|
||||
return request.get('/template-categories')
|
||||
},
|
||||
|
||||
// Get template variables
|
||||
getVariables() {
|
||||
return request.get('/template-variables')
|
||||
}
|
||||
}
|
||||
166
marketing-agent/frontend/src/api/tenant.js
Normal file
166
marketing-agent/frontend/src/api/tenant.js
Normal file
@@ -0,0 +1,166 @@
|
||||
import request from '@/utils/request'
|
||||
|
||||
export const tenantApi = {
|
||||
// Get current tenant information
|
||||
getCurrent() {
|
||||
return request({
|
||||
url: '/api/v1/tenants/current',
|
||||
method: 'get'
|
||||
})
|
||||
},
|
||||
|
||||
// Update tenant basic information
|
||||
update(data) {
|
||||
return request({
|
||||
url: '/api/v1/tenants/current',
|
||||
method: 'patch',
|
||||
data
|
||||
})
|
||||
},
|
||||
|
||||
// Update tenant settings
|
||||
updateSettings(settings) {
|
||||
return request({
|
||||
url: '/api/v1/tenants/current/settings',
|
||||
method: 'patch',
|
||||
data: { settings }
|
||||
})
|
||||
},
|
||||
|
||||
// Update tenant branding
|
||||
updateBranding(branding) {
|
||||
return request({
|
||||
url: '/api/v1/tenants/current/branding',
|
||||
method: 'patch',
|
||||
data: { branding }
|
||||
})
|
||||
},
|
||||
|
||||
// Update tenant compliance settings
|
||||
updateCompliance(compliance) {
|
||||
return request({
|
||||
url: '/api/v1/tenants/current/compliance',
|
||||
method: 'patch',
|
||||
data: { compliance }
|
||||
})
|
||||
},
|
||||
|
||||
// Get tenant usage statistics
|
||||
getUsage() {
|
||||
return request({
|
||||
url: '/api/v1/tenants/current/usage',
|
||||
method: 'get'
|
||||
})
|
||||
},
|
||||
|
||||
// Get tenant billing information
|
||||
getBilling() {
|
||||
return request({
|
||||
url: '/api/v1/tenants/current/billing',
|
||||
method: 'get'
|
||||
})
|
||||
},
|
||||
|
||||
// List all tenants (superadmin only)
|
||||
list(params) {
|
||||
return request({
|
||||
url: '/api/v1/tenants',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
},
|
||||
|
||||
// Get tenant by ID (superadmin only)
|
||||
getById(id) {
|
||||
return request({
|
||||
url: `/api/v1/tenants/${id}`,
|
||||
method: 'get'
|
||||
})
|
||||
},
|
||||
|
||||
// Update tenant by ID (superadmin only)
|
||||
updateById(id, data) {
|
||||
return request({
|
||||
url: `/api/v1/tenants/${id}`,
|
||||
method: 'patch',
|
||||
data
|
||||
})
|
||||
},
|
||||
|
||||
// Delete tenant (superadmin only)
|
||||
delete(id) {
|
||||
return request({
|
||||
url: `/api/v1/tenants/${id}`,
|
||||
method: 'delete'
|
||||
})
|
||||
},
|
||||
|
||||
// Create new tenant (public)
|
||||
signup(data) {
|
||||
return request({
|
||||
url: '/api/v1/tenants/signup',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
},
|
||||
|
||||
// Check if slug is available
|
||||
checkSlug(slug) {
|
||||
return request({
|
||||
url: '/api/v1/tenants/check-slug',
|
||||
method: 'get',
|
||||
params: { slug }
|
||||
})
|
||||
},
|
||||
|
||||
// Upload tenant logo
|
||||
uploadLogo(file) {
|
||||
const formData = new FormData()
|
||||
formData.append('logo', file)
|
||||
|
||||
return request({
|
||||
url: '/api/v1/tenants/current/branding/logo',
|
||||
method: 'post',
|
||||
data: formData,
|
||||
headers: {
|
||||
'Content-Type': 'multipart/form-data'
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
// Get tenant features
|
||||
getFeatures() {
|
||||
return request({
|
||||
url: '/api/v1/tenants/current/features',
|
||||
method: 'get'
|
||||
})
|
||||
},
|
||||
|
||||
// Upgrade tenant plan
|
||||
upgradePlan(plan, paymentMethod) {
|
||||
return request({
|
||||
url: '/api/v1/tenants/current/upgrade',
|
||||
method: 'post',
|
||||
data: { plan, paymentMethod }
|
||||
})
|
||||
},
|
||||
|
||||
// Get tenant audit logs
|
||||
getAuditLogs(params) {
|
||||
return request({
|
||||
url: '/api/v1/tenants/current/audit-logs',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
},
|
||||
|
||||
// Export tenant data
|
||||
exportData(format = 'json') {
|
||||
return request({
|
||||
url: '/api/v1/tenants/current/export',
|
||||
method: 'get',
|
||||
params: { format },
|
||||
responseType: 'blob'
|
||||
})
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user