diff --git a/backend/src/api/admin.ts b/backend/src/api/admin.ts index ca48251..83000c5 100644 --- a/backend/src/api/admin.ts +++ b/backend/src/api/admin.ts @@ -95,6 +95,7 @@ router.post("/addMoney", async (req, res) => { topupRow.admin_uid = req.user!.uid topupRow.admin_name = req.user!.name topupRow.amount = amountToDP.toFixed(2) + topupRow.completed_timestamp = new Date() await sql` UPDATE Users diff --git a/backend/src/api/student.ts b/backend/src/api/student.ts index ef6a6b1..ea6d11a 100644 --- a/backend/src/api/student.ts +++ b/backend/src/api/student.ts @@ -134,6 +134,7 @@ router.post("/createToken", async (req, res) => { admin_uid: null, admin_name: null, amount: null, + completed_timestamp: null, } await sql`INSERT INTO Topup ${sql(topup)}` res.json({ topup_id: topupId }) @@ -175,7 +176,7 @@ router.get("/getTransactions", async (req, res) => { router.get("/getTopups", async (req, res) => { const topups = await sql<{ lucky_draw_code: string; amount: string }[]>` - SELECT Topup.amount, Topup.lucky_draw_code FROM Topup WHERE student_uid = ${ + SELECT Topup.amount, Topup.lucky_draw_code, Topup.completed_timestamp FROM Topup WHERE student_uid = ${ req.user!.uid } AND admin_uid IS NOT NULL ` diff --git a/backend/src/types/topup.ts b/backend/src/types/topup.ts index 34ea4d4..72a5003 100644 --- a/backend/src/types/topup.ts +++ b/backend/src/types/topup.ts @@ -6,6 +6,7 @@ export type TopupTable = { admin_name: string | null // VARCHAR(255) amount: string | null // DECIMAL(10, 2) lucky_draw_code: string // CHAR(13) + completed_timestamp: Date | null // TIMESTAMP } export interface TopupTableInsert extends Omit { diff --git a/frontend/src/api.ts b/frontend/src/api.ts index 1c3c30c..7a532dd 100644 --- a/frontend/src/api.ts +++ b/frontend/src/api.ts @@ -179,7 +179,10 @@ export async function getTransactionHistoryBooth(): Promise< export async function getTopupHistory(): Promise { try { const resp = await fetcher.get("/student/getTopups"); - return resp.data as TopupHistoryDetails[]; + return resp.data.map((obj: Record) => ({ + ...obj, + completed_timestamp: new Date(obj.completed_timestamp), + })) as TopupHistoryDetails[]; } catch (error) { return null; } diff --git a/frontend/src/routes/student_topups_view.tsx b/frontend/src/routes/student_topups_view.tsx index 5c03074..5c52c69 100644 --- a/frontend/src/routes/student_topups_view.tsx +++ b/frontend/src/routes/student_topups_view.tsx @@ -76,6 +76,9 @@ export default function StudentTopupHistoryPage() { Code: {topup.lucky_draw_code} + + {topup.completed_timestamp.toLocaleString()} + )) diff --git a/frontend/src/types/topup.ts b/frontend/src/types/topup.ts index fcfb000..077387d 100644 --- a/frontend/src/types/topup.ts +++ b/frontend/src/types/topup.ts @@ -11,4 +11,5 @@ export type TopupDetails = { export type TopupHistoryDetails = { lucky_draw_code: string; amount: string; + completed_timestamp: Date; }; diff --git a/sql/tables.sql b/sql/tables.sql index c46ff90..6ccbbcf 100644 --- a/sql/tables.sql +++ b/sql/tables.sql @@ -28,5 +28,6 @@ CREATE TABLE Topup( admin_uid CHAR(36), admin_name VARCHAR(255), amount DECIMAL(10, 2), + completed_timestamp TIMESTAMP, lucky_draw_code CHAR(13) DEFAULT 'EXCITE-' || LPAD(NEXTVAL('LuckyDrawCodeSeq')::TEXT, 6, '0') NOT NULL ); \ No newline at end of file