-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathhandle-api.js
More file actions
176 lines (158 loc) · 6.89 KB
/
Copy pathhandle-api.js
File metadata and controls
176 lines (158 loc) · 6.89 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
async function getStateObj(env) {
const raw = await env.MAINTENANCE_KV.get('MAINTENANCE_STATE');
try {
return JSON.parse(raw || '') || {};
} catch {
return {};
}
}
async function setStateObj(env, obj) {
await env.MAINTENANCE_KV.put('MAINTENANCE_STATE', JSON.stringify(obj));
await invalidateCache(['MAINTENANCE_STATE']);
}
async function invalidateCache(keys = ['MAINTENANCE_STATE', 'wan-is-4g', 'ups-on-battery']) {
// Invalidate in-memory cache
if (globalThis.cache) {
globalThis.cache.maintenance = { value: null, ts: 0 };
globalThis.cache.is4g = { value: null, ts: 0 };
globalThis.cache.upsOnBattery = { value: null, ts: 0 };
}
// Invalidate Cloudflare Cache API
try {
const cache = caches.default;
for (const key of keys) {
const cacheUrl = `https://kv-cache.internal/${key}`;
await cache.delete(cacheUrl);
}
} catch (e) {
console.error('Cache API invalidation error:', e);
}
}
async function toggleGlobalMaintenance(env) {
const obj = await getStateObj(env);
obj.isGlobalMaintenance = !(obj.isGlobalMaintenance === true || obj.isGlobalMaintenance === 'true');
await setStateObj(env, obj);
return new Response('Maintenance globale mise à jour');
}
async function addMaintenanceSubdomain(request, env) {
const { subdomain } = await request.json();
const obj = await getStateObj(env);
obj.subdomainsMaintenance = Array.isArray(obj.subdomainsMaintenance) ? obj.subdomainsMaintenance : [];
if (!obj.subdomainsMaintenance.includes(subdomain)) {
obj.subdomainsMaintenance.push(subdomain);
await setStateObj(env, obj);
}
return new Response('Sous-domaine ajouté');
}
async function removeMaintenanceSubdomain(request, env) {
const { subdomain } = await request.json();
const obj = await getStateObj(env);
obj.subdomainsMaintenance = Array.isArray(obj.subdomainsMaintenance) ? obj.subdomainsMaintenance : [];
obj.subdomainsMaintenance = obj.subdomainsMaintenance.filter(d => d !== subdomain);
await setStateObj(env, obj);
return new Response('Sous-domaine retiré');
}
async function setBannerSubdomains(request, env) {
const { subdomains } = await request.json();
if (!Array.isArray(subdomains)) {
return new Response('Format attendu: { subdomains: [...] }', { status: 400 });
}
const obj = await getStateObj(env);
obj.bannerSubdomains = subdomains;
await setStateObj(env, obj);
return new Response('Liste des sous-domaines du bandeau mise à jour');
}
async function addBannerSubdomain(request, env) {
const { subdomain } = await request.json();
if (typeof subdomain !== 'string') return new Response('Format attendu: { subdomain: "..." }', { status: 400 });
const obj = await getStateObj(env);
obj.bannerSubdomains = Array.isArray(obj.bannerSubdomains) ? obj.bannerSubdomains : [];
if (!obj.bannerSubdomains.includes(subdomain)) {
obj.bannerSubdomains.push(subdomain);
await setStateObj(env, obj);
}
return new Response('Sous-domaine ajouté au bandeau');
}
async function removeBannerSubdomain(request, env) {
const { subdomain } = await request.json();
if (typeof subdomain !== 'string') return new Response('Format attendu: { subdomain: "..." }', { status: 400 });
const obj = await getStateObj(env);
obj.bannerSubdomains = Array.isArray(obj.bannerSubdomains) ? obj.bannerSubdomains : [];
obj.bannerSubdomains = obj.bannerSubdomains.filter(d => d !== subdomain);
await setStateObj(env, obj);
return new Response('Sous-domaine retiré du bandeau');
}
async function setBannerMessage(request, env) {
const { message } = await request.json();
if (typeof message !== 'string') {
return new Response('Format attendu: { message: "..." }', { status: 400 });
}
const obj = await getStateObj(env);
obj.bannerMessage = message;
await setStateObj(env, obj);
return new Response('Message du bandeau mis à jour');
}
async function toggle4gMode(env, state) {
if (!env.ENABLE_4G_BANNER) {
return new Response('Fonctionnalité 4G désactivée', { status: 403 });
}
await env.MAINTENANCE_KV.put('wan-is-4g', state.is4gMode ? 'false' : 'true');
await invalidateCache(['wan-is-4g']);
return new Response('Mode 4G mis à jour');
}
async function set4gMode(request, env) {
if (!env.ENABLE_4G_BANNER) {
return new Response('Fonctionnalité 4G désactivée', { status: 403 });
}
const { enabled } = await request.json();
if (typeof enabled !== 'boolean') {
return new Response('Format attendu: { enabled: true/false }', { status: 400 });
}
await env.MAINTENANCE_KV.put('wan-is-4g', enabled ? 'true' : 'false');
await invalidateCache(['wan-is-4g']);
return new Response('Mode 4G mis à jour');
}
async function toggleUpsMode(env, state) {
if (!env.ENABLE_UPS_BANNER) {
return new Response('Fonctionnalité UPS désactivée', { status: 403 });
}
await env.MAINTENANCE_KV.put('ups-on-battery', state.upsOnBattery ? 'false' : 'true');
await invalidateCache(['ups-on-battery']);
return new Response('Mode UPS mis à jour');
}
async function setUpsMode(request, env) {
if (!env.ENABLE_UPS_BANNER) {
return new Response('Fonctionnalité UPS désactivée', { status: 403 });
}
const { enabled } = await request.json();
if (typeof enabled !== 'boolean') {
return new Response('Format attendu: { enabled: true/false }', { status: 400 });
}
await env.MAINTENANCE_KV.put('ups-on-battery', enabled ? 'true' : 'false');
await invalidateCache(['ups-on-battery']);
return new Response('Mode UPS mis à jour');
}
// Route table: [pathname, method, handler]
const routes = [
['/worker/api/toggle-maintenance/global', 'POST', (req, env) => toggleGlobalMaintenance(env)],
['/worker/api/maintenance/subdomain/add', 'POST', (req, env) => addMaintenanceSubdomain(req, env)],
['/worker/api/maintenance/subdomain/remove', 'POST', (req, env) => removeMaintenanceSubdomain(req, env)],
['/worker/api/banner/subdomains', 'POST', (req, env) => setBannerSubdomains(req, env)],
['/worker/api/banner/subdomains/add', 'POST', (req, env) => addBannerSubdomain(req, env)],
['/worker/api/banner/subdomains/remove', 'POST', (req, env) => removeBannerSubdomain(req, env)],
['/worker/api/banner/message', 'POST', (req, env) => setBannerMessage(req, env)],
['/worker/api/toggle-4g-mode', 'POST', (req, env, state) => toggle4gMode(env, state)],
['/worker/api/4g-mode', 'POST', (req, env) => set4gMode(req, env)],
['/worker/api/toggle-ups-mode', 'POST', (req, env, state) => toggleUpsMode(env, state)],
['/worker/api/ups-mode', 'POST', (req, env) => setUpsMode(req, env)],
];
export async function handleApi(request, url, host, env, state) {
if (host !== env.MAINTENANCE_DOMAIN) {
return new Response(`Forbidden: Only accessible on ${env.MAINTENANCE_DOMAIN}`, { status: 403 });
}
const route = routes.find(([path, method]) => url.pathname === path && request.method === method);
if (route) {
return await route[2](request, env, state);
}
return new Response('Forbidden', { status: 403 });
}