feat: base logic

This commit is contained in:
2025-08-31 11:14:07 +07:00
parent abbe4110a3
commit 4af2ff1539
2 changed files with 102 additions and 19 deletions

View File

@@ -1,15 +1,78 @@
/**
* Welcome to Cloudflare Workers! This is your first worker.
*
* - Run `npm run dev` in your terminal to start a development server
* - Open a browser tab at http://localhost:8787/ to see your worker in action
* - Run `npm run deploy` to publish your worker
*
* Learn more at https://developers.cloudflare.com/workers/
*/
export default { export default {
async fetch(request, env, ctx) { async fetch(request, env, ctx) {
return new Response('Hello World!'); if (request.method !== 'POST') {
return new Response('Method not allowed', { status: 405 });
}
try {
const contentType = request.headers.get('content-type');
let text;
if (contentType && contentType.includes('application/json')) {
const body = await request.json();
text = body.text;
} else if (contentType && contentType.includes('application/x-www-form-urlencoded')) {
const formData = await request.formData();
text = formData.get('text');
} else {
return new Response('Content-Type must be application/json or application/x-www-form-urlencoded', { status: 400 });
}
if (!text) {
return new Response('Missing text parameter', { status: 400 });
}
const telegramToken = env.TELEGRAM_TOKEN;
const telegramChatId = env.TELEGRAM_CHAT_ID;
if (!telegramToken || !telegramChatId) {
return new Response('Missing TELEGRAM_TOKEN or TELEGRAM_CHAT_ID environment variables', { status: 500 });
}
const telegramUrl = `https://api.telegram.org/bot${telegramToken}/sendMessage`;
const telegramPayload = {
chat_id: telegramChatId,
text: text
};
const telegramResponse = await fetch(telegramUrl, {
method: 'POST',
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(telegramPayload)
});
const telegramResult = await telegramResponse.json();
if (!telegramResponse.ok) {
return new Response(JSON.stringify({
success: false,
error: 'Telegram API error',
details: telegramResult
}), {
status: 500,
headers: { 'Content-Type': 'application/json' }
});
}
return new Response(JSON.stringify({
success: true,
message: 'Message sent successfully',
telegram_response: telegramResult
}), {
headers: { 'Content-Type': 'application/json' }
});
} catch (error) {
return new Response(JSON.stringify({
success: false,
error: 'Internal server error',
details: error.message
}), {
status: 500,
headers: { 'Content-Type': 'application/json' }
});
}
}, },
}; };

View File

@@ -2,19 +2,39 @@ import { env, createExecutionContext, waitOnExecutionContext, SELF } from 'cloud
import { describe, it, expect } from 'vitest'; import { describe, it, expect } from 'vitest';
import worker from '../src'; import worker from '../src';
describe('Hello World worker', () => { describe('Telegram Worker', () => {
it('responds with Hello World! (unit style)', async () => { it('rejects GET requests', async () => {
const request = new Request('http://example.com'); const request = new Request('http://example.com');
// Create an empty context to pass to `worker.fetch()`.
const ctx = createExecutionContext(); const ctx = createExecutionContext();
const response = await worker.fetch(request, env, ctx); const response = await worker.fetch(request, env, ctx);
// Wait for all `Promise`s passed to `ctx.waitUntil()` to settle before running test assertions
await waitOnExecutionContext(ctx); await waitOnExecutionContext(ctx);
expect(await response.text()).toMatchInlineSnapshot(`"Hello World!"`); expect(response.status).toBe(405);
expect(await response.text()).toMatchInlineSnapshot(`"Method not allowed"`);
}); });
it('responds with Hello World! (integration style)', async () => { it('requires text parameter in JSON POST', async () => {
const response = await SELF.fetch('http://example.com'); const request = new Request('http://example.com', {
expect(await response.text()).toMatchInlineSnapshot(`"Hello World!"`); method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({})
});
const ctx = createExecutionContext();
const response = await worker.fetch(request, env, ctx);
await waitOnExecutionContext(ctx);
expect(response.status).toBe(400);
expect(await response.text()).toMatchInlineSnapshot(`"Missing text parameter"`);
});
it('requires environment variables', async () => {
const request = new Request('http://example.com', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ text: 'Hello World!' })
});
const ctx = createExecutionContext();
const response = await worker.fetch(request, {}, ctx);
await waitOnExecutionContext(ctx);
expect(response.status).toBe(500);
expect(await response.text()).toMatchInlineSnapshot(`"Missing TELEGRAM_TOKEN or TELEGRAM_CHAT_ID environment variables"`);
}); });
}); });