Admin del foro: gestionar traducción EN de categorías y foros
Los formularios de crear categoría/foro aceptan nombre/descripción en inglés, y se añade EDICIÓN en línea de categorías (name, name_en, order) y foros (name, name_en, description, description_en). lib/admin-forum: createCategory/createForum con EN + updateCategory/updateForum; rutas PUT en category/[id] y forum/[id]. Claves Admin nuevas (nombre/descripción EN). Verificado: listado con EN + update round-trip; PUT protegido (403 sin admin). Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -4,6 +4,7 @@ import { db, DB } from './db'
|
||||
export interface AdminCategory {
|
||||
id: number
|
||||
name: string
|
||||
name_en: string
|
||||
order: number
|
||||
}
|
||||
|
||||
@@ -11,7 +12,9 @@ export interface AdminForum {
|
||||
id: number
|
||||
category_id: number
|
||||
name: string
|
||||
name_en: string
|
||||
description: string
|
||||
description_en: string
|
||||
order: number
|
||||
visibility: number
|
||||
}
|
||||
@@ -21,34 +24,45 @@ export async function listCategoriesWithForums(): Promise<
|
||||
{ category: AdminCategory; forums: AdminForum[] }[]
|
||||
> {
|
||||
const [cats] = await db(DB.web).query<RowDataPacket[]>(
|
||||
'SELECT id, name, `order` FROM forum_categories ORDER BY `order`, id',
|
||||
'SELECT id, name, name_en, `order` FROM forum_categories ORDER BY `order`, id',
|
||||
)
|
||||
const [forums] = await db(DB.web).query<RowDataPacket[]>(
|
||||
'SELECT id, category_id, name, description, `order`, visibility FROM forums WHERE deleted = 0 ORDER BY `order`, id',
|
||||
'SELECT id, category_id, name, name_en, description, description_en, `order`, visibility FROM forums WHERE deleted = 0 ORDER BY `order`, id',
|
||||
)
|
||||
return cats.map((c) => ({
|
||||
category: { id: c.id, name: c.name, order: c.order },
|
||||
category: { id: c.id, name: c.name, name_en: c.name_en || '', order: c.order },
|
||||
forums: forums
|
||||
.filter((f) => f.category_id === c.id)
|
||||
.map((f) => ({
|
||||
id: f.id,
|
||||
category_id: f.category_id,
|
||||
name: f.name,
|
||||
name_en: f.name_en || '',
|
||||
description: f.description,
|
||||
description_en: f.description_en || '',
|
||||
order: f.order,
|
||||
visibility: f.visibility,
|
||||
})),
|
||||
}))
|
||||
}
|
||||
|
||||
export async function createCategory(name: string, order: number): Promise<number> {
|
||||
export async function createCategory(name: string, nameEn: string | null, order: number): Promise<number> {
|
||||
const [res] = await db(DB.web).query<ResultSetHeader>(
|
||||
'INSERT INTO forum_categories (name, `order`, created_at) VALUES (?, ?, NOW())',
|
||||
[name, order],
|
||||
'INSERT INTO forum_categories (name, name_en, `order`, created_at) VALUES (?, ?, ?, NOW())',
|
||||
[name, nameEn || null, order],
|
||||
)
|
||||
return res.insertId
|
||||
}
|
||||
|
||||
export async function updateCategory(id: number, name: string, nameEn: string | null, order: number): Promise<void> {
|
||||
await db(DB.web).query('UPDATE forum_categories SET name = ?, name_en = ?, `order` = ? WHERE id = ?', [
|
||||
name,
|
||||
nameEn || null,
|
||||
order,
|
||||
id,
|
||||
])
|
||||
}
|
||||
|
||||
/** Borra una categoría solo si no tiene foros (no borrados). */
|
||||
export async function deleteCategory(id: number): Promise<boolean> {
|
||||
const [f] = await db(DB.web).query<RowDataPacket[]>(
|
||||
@@ -63,18 +77,35 @@ export async function deleteCategory(id: number): Promise<boolean> {
|
||||
export async function createForum(
|
||||
categoryId: number,
|
||||
name: string,
|
||||
nameEn: string | null,
|
||||
description: string,
|
||||
descriptionEn: string | null,
|
||||
order: number,
|
||||
visibility: number,
|
||||
): Promise<number> {
|
||||
const [res] = await db(DB.web).query<ResultSetHeader>(
|
||||
'INSERT INTO forums (category_id, name, description, `order`, type, visibility, deleted, created_at, updated_at) ' +
|
||||
'VALUES (?, ?, ?, ?, 0, ?, 0, NOW(), NOW())',
|
||||
[categoryId, name, description, order, visibility ? 1 : 0],
|
||||
'INSERT INTO forums (category_id, name, name_en, description, description_en, `order`, type, visibility, deleted, created_at, updated_at) ' +
|
||||
'VALUES (?, ?, ?, ?, ?, ?, 0, ?, 0, NOW(), NOW())',
|
||||
[categoryId, name, nameEn || null, description, descriptionEn || null, order, visibility ? 1 : 0],
|
||||
)
|
||||
return res.insertId
|
||||
}
|
||||
|
||||
export async function updateForum(
|
||||
id: number,
|
||||
name: string,
|
||||
nameEn: string | null,
|
||||
description: string,
|
||||
descriptionEn: string | null,
|
||||
order: number,
|
||||
visibility: number,
|
||||
): Promise<void> {
|
||||
await db(DB.web).query(
|
||||
'UPDATE forums SET name = ?, name_en = ?, description = ?, description_en = ?, `order` = ?, visibility = ?, updated_at = NOW() WHERE id = ?',
|
||||
[name, nameEn || null, description, descriptionEn || null, order, visibility ? 1 : 0, id],
|
||||
)
|
||||
}
|
||||
|
||||
/** Borrado lógico de un foro (deleted = 1). */
|
||||
export async function deleteForum(id: number): Promise<void> {
|
||||
await db(DB.web).query('UPDATE forums SET deleted = 1 WHERE id = ?', [id])
|
||||
|
||||
Reference in New Issue
Block a user