feat: complete telegram cms system with workflows and deployment guide

- Add ULTIMATE-Telegram-CMS-COMPLETE.json with all commands
- Add Docker Event workflows with Gitea integration
- Add comprehensive deployment guide for fresh installs
- Add quick reference and testing checklist
- Include all n8n workflow exports

Commands:
/start, /list, /search, /stats, /preview, /publish, /delete, .review

Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
This commit is contained in:
2026-04-02 12:10:07 +02:00
parent 9d3e7ad44a
commit a36268302c
20 changed files with 6334 additions and 0 deletions

View File

@@ -0,0 +1,459 @@
{
"name": "Telegram Command",
"nodes": [
{
"parameters": {
"updates": [
"message"
],
"additionalFields": {}
},
"type": "n8n-nodes-base.telegramTrigger",
"typeVersion": 1.2,
"position": [
0,
0
],
"id": "6a6751de-48cc-49e8-a0e0-dce88167a809",
"name": "Telegram Trigger",
"webhookId": "9c77ead0-c342-4fae-866d-d0d9247027e2",
"credentials": {
"telegramApi": {
"id": "ADurvy9EKUDzbDdq",
"name": "DK0_Server"
}
}
},
{
"parameters": {
"jsCode": " var text = $input.first().json.message?.text ?? '';\n var chatId = $input.first().json.message?.chat?.id;\n var match;\n\n match = text.match(/\\/publishproject(\\d+)/);\n if (match) return [{ json: { action: 'publish', id: match[1], collection: 'projects', chatId: chatId } }];\n\n match = text.match(/\\/deleteproject(\\d+)/);\n if (match) return [{ json: { action: 'delete', id: match[1], collection: 'projects', chatId: chatId } }];\n\n match = text.match(/\\/publishbook(\\d+)/);\n if (match) return [{ json: { action: 'publish', id: match[1], collection: 'book_reviews', chatId: chatId } }];\n\n match = text.match(/\\/deletebook(\\d+)/);\n if (match) return [{ json: { action: 'delete', id: match[1], collection: 'book_reviews', chatId: chatId } }];\n\n match = text.match(/\\/deletereview(\\d+)/);\n if (match) return [{ json: { action: 'delete_review', id: match[1], chatId: chatId } }];\n\n if (text.startsWith('.review')) {\n var rest = text.replace('.review', '').trim();\n var firstSpace = rest.indexOf(' ');\n var secondSpace = rest.indexOf(' ', firstSpace + 1);\n var hcId = rest.substring(0, firstSpace);\n var rating = parseInt(rest.substring(firstSpace + 1, secondSpace)) || 3;\n var answers = rest.substring(secondSpace + 1);\n return [{ json: { action: 'create_review', hardcoverId: hcId, rating: rating, answers: answers, chatId: chatId } }];\n }\n\n return [{ json: { action: 'unknown', chatId: chatId, text: text } }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
192,
16
],
"id": "31f87727-adce-4df2-a957-2ff4a13218d9",
"name": "Code in JavaScript"
},
{
"parameters": {
"rules": {
"values": [
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"leftValue": "={{ $json.action }}",
"rightValue": "publishproject",
"operator": {
"type": "string",
"operation": "contains"
},
"id": "ce154df4-9dd0-441b-9df2-5700fcdb7c33"
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "Publish Project"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "aae406a7-311b-4c52-b6d2-afa40fecd0b9",
"leftValue": "={{ $json.action }}",
"rightValue": "deleteproject",
"operator": {
"type": "string",
"operation": "contains"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "Delete Project"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "57d9f445-1a71-4385-b01c-718283864108",
"leftValue": "={{ $json.action }}",
"rightValue": "publishbook",
"operator": {
"type": "string",
"operation": "contains"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "Publish Book"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "79fd4ff3-31bc-41d1-acb0-04577492d90a",
"leftValue": "={{ $json.action }}",
"rightValue": "deletebook",
"operator": {
"type": "string",
"operation": "contains"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "Delete Book"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "9536178d-bcfa-4d0a-bf51-2f9521f5a55f",
"leftValue": "={{ $json.action }}",
"rightValue": "deletereview",
"operator": {
"type": "string",
"operation": "contains"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "Delete Review"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "ce822e16-e8a1-45f3-b1dd-795d1d9fccd0",
"leftValue": "={{ $json.action }}",
"rightValue": ".review",
"operator": {
"type": "string",
"operation": "contains"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "Review"
},
{
"conditions": {
"options": {
"caseSensitive": true,
"leftValue": "",
"typeValidation": "strict",
"version": 3
},
"conditions": [
{
"id": "5551fb2c-c25e-4123-b34c-f359eefc6fcd",
"leftValue": "={{ $json.action }}",
"rightValue": "unknown",
"operator": {
"type": "string",
"operation": "contains"
}
}
],
"combinator": "and"
},
"renameOutput": true,
"outputKey": "unknown"
}
]
},
"options": {}
},
"type": "n8n-nodes-base.switch",
"typeVersion": 3.4,
"position": [
400,
16
],
"id": "724ae93f-e1d6-4264-a6a0-6c5cce24e594",
"name": "Switch"
},
{
"parameters": {
"jsCode": "const { id, collection } = $input.first().json;\n\nconst response = await this.helpers.httpRequest({\n method: \"PATCH\",\n url: `https://cms.dk0.dev/items/${collection}/${id}`,\n headers: {\n \"Content-Type\": \"application/json\",\n Authorization: \"Bearer RF2QytqhcLXuVy6FO3PzWlsoR-ysCTwB\",\n },\n body: { status: \"published\" },\n});\n\nreturn [{ json: { ...response, action: \"published\", id, collection } }];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
640,
-144
],
"id": "8409c223-d5f3-4f86-b1bc-639775a504c0",
"name": "Code in JavaScript1"
},
{
"parameters": {
"jsCode": "const { id, collection } = $input.first().json;\n\nawait this.helpers.httpRequest({\n method: \"DELETE\",\n url: `https://cms.dk0.dev/items/${collection}/${id}`,\n headers: {\n Authorization: \"Bearer RF2QytqhcLXuVy6FO3PzWlsoR-ysCTwB\",\n },\n});\n\nreturn [{ json: { id, collection } }];\n"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
640,
16
],
"id": "ec6d4201-d382-49ba-8754-1750286377eb",
"name": "Code in JavaScript2"
},
{
"parameters": {
"chatId": "145931600",
"text": "={{ '🗑️ #' + $json.id + ' aus ' + $json.collection + ' gelöscht.' }}",
"additionalFields": {}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
848,
16
],
"id": "ef166bfe-d006-4231-a062-f031c663d034",
"name": "Send a text message1",
"webhookId": "7fa154b5-7382-489d-9ee9-066e156f58da",
"credentials": {
"telegramApi": {
"id": "8iiaTtJHXgDIiVaa",
"name": "Telegram"
}
}
},
{
"parameters": {
"chatId": "145931600",
"text": "={{ '✅ #' + $json.id + ' in ' + $json.collection + ' veröffentlicht!' }}",
"additionalFields": {}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
848,
-144
],
"id": "c7ff73bb-22f2-4754-88a8-b91cf9743329",
"name": "Send a text message",
"webhookId": "2c95cd9d-1d1d-4249-8e64-299a46e8638e",
"credentials": {
"telegramApi": {
"id": "8iiaTtJHXgDIiVaa",
"name": "Telegram"
}
}
},
{
"parameters": {
"chatId": "145931600145931600",
"text": "={{ '❓ Unbekannter Command\\n\\nVerfügbar:\\n/publish_project_ID\\n/delete_project_ID\\n/publish_book_ID\\n/delete_book_ID' }}",
"additionalFields": {}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
624,
192
],
"id": "8d71429d-b006-4748-9e11-42e17039075b",
"name": "Send a text message2",
"webhookId": "8a211bf8-54ca-4779-9535-21d65b14a4f7",
"credentials": {
"telegramApi": {
"id": "8iiaTtJHXgDIiVaa",
"name": "Telegram"
}
}
},
{
"parameters": {
"jsCode": " const d = $input.first().json;\n\n const check = await this.helpers.httpRequest({\n method: \"GET\",\n url: \"https://cms.dk0.dev/items/book_reviews?filter[hardcover_id][_eq]=\" + d.hardcoverId +\n \"&fields=id,book_title,book_author,book_image,finished_at&limit=1\",\n headers: { \"Authorization\": \"Bearer RF2QytqhcLXuVy6FO3PzWlsoR-ysCTwB\" }\n });\n\n const book = check.data?.[0];\n if (!book) return [{ json: { error: \"Buch nicht gefunden\", chatId: d.chatId } }];\n\n const parts = [];\n parts.push(\"Schreibe eine authentische Buchbewertung.\");\n parts.push(\"Buch: \" + book.book_title + \" von \" + book.book_author);\n parts.push(\"Rating: \" + d.rating + \"/5\");\n parts.push(\"Antworten des Lesers: \" + d.answers);\n parts.push(\"Schreibe Ich-Perspektive, 4-6 Saetze pro Sprache.\");\n parts.push(\"Antworte NUR als JSON:\");\n parts.push('{\"review_en\": \"English\", \"review_de\": \"Deutsch\"}');\n const prompt = parts.join(\" \");\n\n const aiResponse = await this.helpers.httpRequest({\n method: \"POST\",\n url: \"https://openrouter.ai/api/v1/chat/completions\",\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": \"Bearer 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\"\n },\n body: {\n model: \"google/gemini-2.0-flash-exp:free\",\n messages: [{ role: \"user\", content: prompt }]\n }\n });\n\n const aiText = aiResponse.choices?.[0]?.message?.content ?? \"{}\";\n const match = aiText.match(/\\{[\\s\\S]*\\}/);\n const ai = match ? JSON.parse(match[0]) : { review_en: d.answers, review_de: d.answers };\n\n const result = await this.helpers.httpRequest({\n method: \"PATCH\",\n url: \"https://cms.dk0.dev/items/book_reviews/\" + book.id,\n headers: {\n \"Content-Type\": \"application/json\",\n \"Authorization\": \"Bearer RF2QytqhcLXuVy6FO3PzWlsoR-ysCTwB\"\n },\n body: {\n rating: d.rating,\n status: \"draft\",\n translations: {\n create: [\n { languages_code: \"en-US\", review: ai.review_en },\n { languages_code: \"de-DE\", review: ai.review_de }\n ]\n }\n }\n });\n\n return [{ json: { id: book.id, title: book.book_title, rating: d.rating, chatId: d.chatId } }];"
},
"type": "n8n-nodes-base.code",
"typeVersion": 2,
"position": [
912,
160
],
"id": "ea82c02e-eeb8-4acd-a0e6-e4a9f8cb8bf9",
"name": "Code in JavaScript3"
},
{
"parameters": {
"chatId": "145931600",
"text": "={{ '✅ Review fuer \"' + $json.title + '\" erstellt! ⭐' + $json.rating + '/5\\n\\n/publishbook' + $json.id + ' — Veroeffentlichen\\n/deletebook' + $json.id + ' — Loeschen' }}",
"additionalFields": {}
},
"type": "n8n-nodes-base.telegram",
"typeVersion": 1.2,
"position": [
1216,
160
],
"id": "c46f5182-a815-442d-ac72-c8694b982e74",
"name": "Send a text message3",
"webhookId": "3452ada6-a863-471d-89a1-31bf625ce559",
"credentials": {
"telegramApi": {
"id": "8iiaTtJHXgDIiVaa",
"name": "Telegram"
}
}
}
],
"pinData": {},
"connections": {
"Telegram Trigger": {
"main": [
[
{
"node": "Code in JavaScript",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript": {
"main": [
[
{
"node": "Switch",
"type": "main",
"index": 0
}
]
]
},
"Switch": {
"main": [
[
{
"node": "Code in JavaScript1",
"type": "main",
"index": 0
}
],
[
{
"node": "Code in JavaScript2",
"type": "main",
"index": 0
}
],
[
{
"node": "Code in JavaScript3",
"type": "main",
"index": 0
}
],
[
{
"node": "Send a text message2",
"type": "main",
"index": 0
}
],
[],
[],
[]
]
},
"Code in JavaScript1": {
"main": [
[
{
"node": "Send a text message",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript2": {
"main": [
[
{
"node": "Send a text message1",
"type": "main",
"index": 0
}
]
]
},
"Code in JavaScript3": {
"main": [
[
{
"node": "Send a text message3",
"type": "main",
"index": 0
}
]
]
}
},
"active": false,
"settings": {
"executionOrder": "v1",
"binaryMode": "separate",
"availableInMCP": false
},
"versionId": "a7449224-9a28-4aff-b4e2-26f1bcd4542f",
"meta": {
"templateCredsSetupCompleted": true,
"instanceId": "cb28e4db755465d5826da179e87f69603d81f833414cc52c327be9183a217b8d"
},
"id": "8mZbFdEsOeufWutD",
"tags": []
}