diff --git a/app/api/point/route.ts b/app/api/point/route.ts index c550d5d..8837f2c 100644 --- a/app/api/point/route.ts +++ b/app/api/point/route.ts @@ -37,7 +37,7 @@ export const GET = async (req: NextRequest) => { } const { rows } = await pool.query( - `SELECT * FROM "point" WHERE "userid"=$1;`, + `SELECT * FROM "point" WHERE "userid"=$1 ORDER BY createdat DESC;`, [userID] ); diff --git a/app/api/stats/route.ts b/app/api/stats/route.ts new file mode 100644 index 0000000..34121c1 --- /dev/null +++ b/app/api/stats/route.ts @@ -0,0 +1,99 @@ +import { NextRequest, NextResponse } from 'next/server'; +import { getDBConnexion } from '../utils'; + +export const GET = async (req: NextRequest) => { + const userID = req.headers.get('Authorization'); + + if (!userID) { + return NextResponse.json( + { + error: true, + message: 'Unauthorized request', + }, + { + status: 403, + } + ); + } + + try { + const pool = getDBConnexion(); + + const { rows: userCount } = await pool.query( + `SELECT * FROM "user" WHERE "id"=$1 LIMIT 1;`, + [userID] + ); + + if (userCount.length != 1) { + return NextResponse.json( + { + error: true, + message: 'User not found', + }, + { + status: 404, + } + ); + } + + const { rows } = await pool.query( + ` +SELECT ( + SELECT AVG(entries) + FROM ( + SELECT COUNT(*) AS entries + FROM point + WHERE userid=$1 + GROUP BY date_part('year', createdat) + ) +) AS avgPerYear, +( + SELECT AVG(entries) + FROM ( + SELECT COUNT(*) AS entries + FROM point + WHERE userid=$1 + GROUP BY date_part('year', createdat), date_part('month', createdat) + ) +) AS avgPerMonth, +( + SELECT AVG(entries) + FROM ( + SELECT COUNT(*) AS entries + FROM point + WHERE userid=$1 + GROUP BY date_part('year', createdat), date_part('month', createdat), date_part('week', createdat) + ) +) AS avgPerWeek, +( + SELECT COUNT(*) + FROM point + WHERE userid=$1 +) AS total;`, + [userID] + ); + + const result = { + year: Math.round(parseFloat(rows[0].avgperyear)), + month: Math.round(parseFloat(rows[0].avgpermonth)), + week: Math.round(parseFloat(rows[0].avgperweek)), + total: parseInt(rows[0].total), + }; + + await pool.end(); + return NextResponse.json(result, { + status: 200, + }); + } catch (error) { + console.error(error); + return NextResponse.json( + { + error: true, + message: 'Internal error', + }, + { + status: 500, + } + ); + } +}; diff --git a/app/my-loves/hooks/useActions.ts b/app/my-loves/hooks/useActions.ts index 7c0b1fb..ccdaf5e 100644 --- a/app/my-loves/hooks/useActions.ts +++ b/app/my-loves/hooks/useActions.ts @@ -38,6 +38,7 @@ export const useActions = ({ if (response.ok) { await refreshDataset(); setLoveToDelete(null); + setIsLoading(false); return; } } catch (error) { diff --git a/app/my-loves/page.tsx b/app/my-loves/page.tsx index d5dc3af..e308371 100644 --- a/app/my-loves/page.tsx +++ b/app/my-loves/page.tsx @@ -58,7 +58,9 @@ const MyLoves = () => {
{love.location}
{love.comment || '-'}
-Le: {love.createdat}
++ Créé le: {love.createdat} +