Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
636 changes: 322 additions & 314 deletions schema.prisma

Large diffs are not rendered by default.

24 changes: 24 additions & 0 deletions src/controllers/admin/faq/createFaq.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,24 @@
import { Request, Response } from "express";
import { createFaq } from "../../../operations/faq";
import { hasPermission } from "../../../middlewares/authentication";
import { Permission } from "../../../types";

export default [
...hasPermission(Permission.admin),

async function createFaqHandler(req: Request, res: Response) {
try {
const { category, question, answer, display } = req.body;

if (!category || !question || !answer) {
return res.status(400).json({ error: "Missing required fields" });
}

const faq = await createFaq(category, question, answer, display);
return res.status(201).json(faq);
} catch (err) {
console.error("Error creating FAQ:", err);
return res.status(500).json({ error: "Internal server error" });
}
}
];
19 changes: 19 additions & 0 deletions src/controllers/admin/faq/deleteFaq.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,19 @@
import { Request, Response } from "express";
import { deleteFaq } from "../../../operations/faq";
import { hasPermission } from "../../../middlewares/authentication";
import { Permission } from "../../../types";

export default [
...hasPermission(Permission.admin),

async function deleteFaqHandler(req: Request, res: Response) {
try {
const { id } = req.params;
await deleteFaq(id);
return res.status(204).send();
} catch (err) {
console.error("Error deleting FAQ:", err);
return res.status(500).json({ error: "Internal server error" });
}
}
];
26 changes: 26 additions & 0 deletions src/controllers/admin/faq/getFaq.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
import { Request, Response } from "express";
import { getAllFaqs, getFaqById } from "../../../operations/faq";
import { hasPermission } from '../../../middlewares/authentication';
import { Permission, Error } from '../../../types';

export default[
// Middlewares
...hasPermission(Permission.admin),
async function getFaq(req: Request, res: Response) {
try {
const { id } = req.params;

if (id) {
const faq = await getFaqById(id);
if (!faq) return res.status(404).json({ error: "FAQ not found" });
return res.json(faq);
}

const faqs = await getAllFaqs();
return res.json(faqs);
} catch (err) {
console.error("Error fetching FAQ:", err);
return res.status(500).json({ error: "Internal server error" });
}
}
];
22 changes: 22 additions & 0 deletions src/controllers/admin/faq/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,22 @@
import { Router } from "express";
import getFaq from "./getFaq";
import createFaq from "./createFaq";
import updateFaq from "./updateFaq";
import deleteFaq from "./deleteFaq";

const router = Router();

// Récupérer toutes les FAQ ou une seule par ID
router.get("/", getFaq);
router.get("/:id", getFaq);

// Créer une FAQ
router.post("/", createFaq);

// Mettre à jour une FAQ
router.put("/:id", updateFaq);

// Supprimer une FAQ
router.delete("/:id", deleteFaq);

export default router;
21 changes: 21 additions & 0 deletions src/controllers/admin/faq/updateFaq.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
import { Request, Response } from "express";
import { updateFaq } from "../../../operations/faq";
import { hasPermission } from "../../../middlewares/authentication";
import { Permission } from "../../../types";

export default [
...hasPermission(Permission.admin),

async function updateFaqHandler(req: Request, res: Response) {
try {
const { id } = req.params;
const data = req.body;

const faq = await updateFaq(id, data.category, data.question, data.answer, data.display);
return res.json(faq);
} catch (err) {
console.error("Error updating FAQ:", err);
return res.status(500).json({ error: "Internal server error" });
}
}
];
2 changes: 2 additions & 0 deletions src/controllers/admin/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,6 +12,7 @@ import tournaments from './tournaments';
import partners from './partners';
import settings from './settings';
import upload from './upload';
import faq from './faq';

const router = Router();

Expand All @@ -28,5 +29,6 @@ router.use('/tournaments', tournaments);
router.use('/partners', partners);
router.use('/settings', settings);
router.use('/upload', upload);
router.use('/faq', faq);

export default router;
67 changes: 67 additions & 0 deletions src/operations/faq.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
import {PrismaPromise } from '@prisma/client';
import type { PrimitiveFaq, Faq} from "../types";
import database from '../services/database';
import { nanoid } from 'nanoid';

// Récupère toutes les FAQs
export async function getAllFaqs(): Promise<Faq[]> {
const faqs: PrimitiveFaq[] = await database.faq.findMany({
orderBy: { category: "asc" },
});

// On convertit en Faq (ici, c’est identique, mais tu pourras enrichir plus tard)
return faqs.map(faq => ({
...faq,
id: String(faq.id),
category: faq.category,
question: faq.question,
answer: faq.answer,
display: faq.display,
}));
}

// Récupère une FAQ par son ID
export async function getFaqById(id: string): Promise<Faq | null> {
const faq = await database.faq.findUnique({ where: { id } });
if (!faq) return null;

return {
...faq,
id: String(faq.id),
category: faq.category,
question: faq.question,
answer: faq.answer,
display: faq.display,
};
}


// Crée une nouvelle FAQ
export async function createFaq(category:string, question:string, answer:string, display:boolean): Promise<Faq> {
const faq = await database.faq.create({
data: {
id: nanoid(),
category,
question,
answer,
display,
}
});
return { ...faq, id: String(faq.id) };
}



//Met à jour une FAQ existante
export async function updateFaq(id: string, category:string, question:string, answer:string, display:boolean): Promise<Faq> {
const faq = await database.faq.update({
where: { id },
data: { category, question, answer, display },
});
return { ...faq, id: String(faq.id) };
}

// Supprime une FAQ
export async function deleteFaq(id: string): Promise<void> {
await database.faq.delete({ where: { id } });
}
9 changes: 9 additions & 0 deletions src/types.ts
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,7 @@ export type PrimitiveTournament = prisma.Tournament;
export type RepoItem = prisma.RepoItem;
export type RepoLog = prisma.RepoLog & { item: RepoItem };
export type RawOrga = prisma.Orga;
export type PrimitiveFaq = prisma.Faq;

export type Item = RawItem & {
left?: number;
Expand Down Expand Up @@ -245,6 +246,14 @@ export type Tournament = PrimitiveTournament & {
casters: Caster[];
};

export type Faq = PrimitiveFaq & {
id:string;
category:string;
question:string;
answer:string;
display:boolean;
}

/************/
/** Badges **/
/************/
Expand Down