This commit is contained in:
mrfelfel
2026-07-18 19:41:33 +03:30
parent 87ba0d253d
commit dfb0e857f1
158 changed files with 20278 additions and 0 deletions

View File

@@ -0,0 +1,22 @@
import { a as isValidLogin, s as setAdminSession } from '../../../chunks/adminAuth_CY4OwU1a.mjs';
export { renderers } from '../../../renderers.mjs';
const POST = async (context) => {
const formData = await context.request.formData();
const username = String(formData.get("username") ?? "");
const password = String(formData.get("password") ?? "");
if (!isValidLogin(username, password)) {
return context.redirect("/admin/login/?error=1", 302);
}
setAdminSession(context);
return context.redirect("/admin/", 302);
};
const _page = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
__proto__: null,
POST
}, Symbol.toStringTag, { value: 'Module' }));
const page = () => _page;
export { page };

View File

@@ -0,0 +1,16 @@
import { c as clearAdminSession } from '../../../chunks/adminAuth_CY4OwU1a.mjs';
export { renderers } from '../../../renderers.mjs';
const POST = async (context) => {
clearAdminSession(context);
return context.redirect("/admin/login/", 302);
};
const _page = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
__proto__: null,
POST
}, Symbol.toStringTag, { value: 'Module' }));
const page = () => _page;
export { page };

View File

@@ -0,0 +1,143 @@
import { r as requireAdmin } from '../../../chunks/adminAuth_CY4OwU1a.mjs';
import { r as readCms, w as writeCms } from '../../../chunks/cms_CRTVymfB.mjs';
import { p as publishPost } from '../../../chunks/publisher_Dj_UvF8J.mjs';
import { g as getTassFeedLinks } from '../../../chunks/tassAgent_jxZgSz7r.mjs';
export { renderers } from '../../../renderers.mjs';
const toList = (value) => String(value ?? "").split(/\r?\n|,/).map((item) => item.trim()).filter(Boolean);
const toParagraphs = (value) => String(value ?? "").split(/\n\s*\n/).map((item) => item.trim()).filter(Boolean);
const POST = async (context) => {
const unauthorized = requireAdmin(context);
if (unauthorized) {
return unauthorized;
}
const formData = await context.request.formData();
const action = String(formData.get("action") ?? "");
const cms = await readCms();
const tab = String(formData.get("tab") ?? "pending");
if (action === "post-status") {
const slug = String(formData.get("slug") ?? "");
const status = String(formData.get("status") ?? "pending");
cms.posts = cms.posts.map((post) => post.slug === slug ? { ...post, status } : post);
}
if (action === "toggle-post-flag") {
const slug = String(formData.get("slug") ?? "");
const flag = String(formData.get("flag") ?? "");
cms.posts = cms.posts.map((post) => {
if (post.slug !== slug) {
return post;
}
if (flag === "urgent") {
return { ...post, urgent: !post.urgent };
}
if (flag === "sidebar") {
return { ...post, sidebar: !post.sidebar };
}
return post;
});
}
if (action === "set-breaking-post") {
const slug = String(formData.get("slug") ?? "");
const post = cms.posts.find((item) => item.slug === slug);
if (post) {
cms.settings.breakingNews = {
...cms.settings.breakingNews,
href: `/posts/${post.slug}/`,
items: [post.title],
postSlugs: [post.slug]
};
}
}
if (action === "set-home-featured") {
const slug = String(formData.get("slug") ?? "");
cms.settings.homeLayout.featuredSlug = slug;
}
if (action === "clear-tass-memory") {
cms.settings.agents = {
...cms.settings.agents,
tass: { processedLinks: [] }
};
}
if (action === "fill-tass-memory") {
const links = cms.posts.map((post) => post.sourceUrl).filter(Boolean);
const feedLinks = await getTassFeedLinks(50);
cms.settings.agents = {
...cms.settings.agents,
tass: { processedLinks: Array.from(/* @__PURE__ */ new Set([...links, ...feedLinks])) }
};
}
if (action === "delete-post") {
const slug = String(formData.get("slug") ?? "");
const confirm = String(formData.get("confirm") ?? "");
if (confirm !== "confirm") {
return context.redirect(`/admin/?deleteError=1&tab=${encodeURIComponent(tab)}`, 302);
}
cms.posts = cms.posts.filter((post) => post.slug !== slug);
}
if (action === "delete-all-posts") {
const confirm = String(formData.get("confirm") ?? "");
if (confirm !== "confirm") {
return context.redirect(`/admin/?deleteError=1&tab=${encodeURIComponent(tab)}`, 302);
}
cms.posts = [];
}
if (action === "save-post") {
const originalSlug = String(formData.get("originalSlug") ?? "");
const title = String(formData.get("title") ?? "").trim();
const post = await publishPost({
slug: String(formData.get("slug") ?? "") || title,
title,
category: String(formData.get("category") ?? cms.categories[0] ?? "عمومی"),
time: String(formData.get("time") ?? "").trim() || "هم‌اکنون",
readTime: String(formData.get("readTime") ?? "").trim() || "۳ دقیقه",
excerpt: String(formData.get("excerpt") ?? "").trim(),
status: String(formData.get("status") ?? "pending"),
body: toParagraphs(formData.get("body")),
image: String(formData.get("image") ?? "").trim() || void 0,
thumbnail: String(formData.get("thumbnail") ?? "").trim() || void 0,
urgent: formData.get("urgent") === "on",
sidebar: formData.get("sidebar") === "on"
});
if (originalSlug && originalSlug !== post.slug) {
const updatedCms = await readCms();
updatedCms.posts = updatedCms.posts.filter((post2) => post2.slug !== originalSlug);
await writeCms(updatedCms);
}
return context.redirect(`/admin/?saved=1&tab=${post.status === "approved" ? "approved" : "pending"}`, 302);
}
if (action === "categories") {
cms.categories = toList(formData.get("categories"));
}
if (action === "settings") {
cms.settings.breakingNews = {
label: String(formData.get("breakingLabel") ?? "فوری").trim(),
href: String(formData.get("breakingHref") ?? "/").trim(),
items: toList(formData.get("breakingItems")),
postSlugs: toList(formData.get("breakingPostSlugs"))
};
cms.settings.hotTopics = toList(formData.get("hotTopics"));
cms.settings.homeLayout = {
featuredSlug: String(formData.get("featuredSlug") ?? "").trim(),
sideFeaturedSlugs: toList(formData.get("sideFeaturedSlugs")).slice(0, 2),
latestCount: Math.max(1, Number(formData.get("latestCount") ?? 4)),
showAd: formData.get("showAd") === "on"
};
cms.settings.ad = {
enabled: formData.get("adEnabled") === "on",
label: String(formData.get("adLabel") ?? "آگهی").trim(),
href: String(formData.get("adHref") ?? "/advertise/").trim(),
text: String(formData.get("adText") ?? "").trim()
};
}
await writeCms(cms);
return context.redirect(`/admin/?saved=1&tab=${encodeURIComponent(tab)}`, 302);
};
const _page = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
__proto__: null,
POST
}, Symbol.toStringTag, { value: 'Module' }));
const page = () => _page;
export { page };

View File

@@ -0,0 +1,30 @@
import { r as requireAdmin } from '../../../chunks/adminAuth_CY4OwU1a.mjs';
import { s as storeImageBuffer } from '../../../chunks/images_DSuHPXn1.mjs';
export { renderers } from '../../../renderers.mjs';
const POST = async (context) => {
const unauthorized = requireAdmin(context);
if (unauthorized) {
return unauthorized;
}
const formData = await context.request.formData();
const file = formData.get("image");
if (!(file instanceof File) || file.size === 0) {
return context.json({ error: "فایل تصویری ارسال نشده است." }, 400);
}
try {
const storedImage = await storeImageBuffer(Buffer.from(await file.arrayBuffer()));
return context.json(storedImage, 200);
} catch {
return context.json({ error: "پردازش تصویر ناموفق بود." }, 500);
}
};
const _page = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
__proto__: null,
POST
}, Symbol.toStringTag, { value: 'Module' }));
const page = () => _page;
export { page };

View File

@@ -0,0 +1,36 @@
import { r as requireApiToken } from '../../../chunks/apiAuth_DcNSM7D5.mjs';
import { i as isAdminAuthenticated } from '../../../chunks/adminAuth_CY4OwU1a.mjs';
import { r as runTassAgent } from '../../../chunks/tassAgent_jxZgSz7r.mjs';
export { renderers } from '../../../renderers.mjs';
const POST = async (context) => {
if (!isAdminAuthenticated(context)) {
const unauthorized = requireApiToken(context);
if (unauthorized) {
return unauthorized;
}
}
try {
const contentType = context.request.headers.get("content-type") ?? "";
const payload = contentType.includes("application/json") ? await context.request.json() : {};
const limit = Math.min(Math.max(Number(payload.limit ?? 3), 1), 10);
const result = await runTassAgent(limit);
return new Response(JSON.stringify({ ok: true, ...result }), {
headers: { "content-type": "application/json; charset=utf-8" }
});
} catch (error) {
return new Response(JSON.stringify({ ok: false, error: error instanceof Error ? error.message : "Agent failed" }), {
status: 500,
headers: { "content-type": "application/json; charset=utf-8" }
});
}
};
const _page = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
__proto__: null,
POST
}, Symbol.toStringTag, { value: 'Module' }));
const page = () => _page;
export { page };

View File

@@ -0,0 +1,50 @@
import { r as requireApiToken } from '../../../chunks/apiAuth_DcNSM7D5.mjs';
import { p as publishPost } from '../../../chunks/publisher_Dj_UvF8J.mjs';
import { d as downloadAndStoreImage } from '../../../chunks/images_DSuHPXn1.mjs';
export { renderers } from '../../../renderers.mjs';
const POST = async (context) => {
const unauthorized = requireApiToken(context);
if (unauthorized) {
return unauthorized;
}
try {
const payload = await context.request.json();
let image = payload.image;
let thumbnail = payload.thumbnail;
if (payload.imageUrl && !image) {
const storedImage = await downloadAndStoreImage(String(payload.imageUrl));
image = storedImage?.image;
thumbnail = storedImage?.thumbnail;
}
const post = await publishPost({
title: String(payload.title ?? ""),
slug: payload.slug ? String(payload.slug) : void 0,
category: payload.category ? String(payload.category) : void 0,
time: payload.time ? String(payload.time) : void 0,
readTime: payload.readTime ? String(payload.readTime) : void 0,
excerpt: payload.excerpt ? String(payload.excerpt) : void 0,
body: Array.isArray(payload.body) ? payload.body.map(String) : String(payload.body ?? ""),
status: payload.status === "approved" ? "approved" : "pending",
image,
thumbnail
});
return new Response(JSON.stringify({ ok: true, post }), {
headers: { "content-type": "application/json; charset=utf-8" }
});
} catch (error) {
return new Response(JSON.stringify({ ok: false, error: error instanceof Error ? error.message : "Invalid request" }), {
status: 400,
headers: { "content-type": "application/json; charset=utf-8" }
});
}
};
const _page = /*#__PURE__*/Object.freeze(/*#__PURE__*/Object.defineProperty({
__proto__: null,
POST
}, Symbol.toStringTag, { value: 'Module' }));
const page = () => _page;
export { page };