@@ -15,10 +49,12 @@ const { loggedIn } = storeToRefs(loginStore);
+ Personlig træner -->
Login
+ Træningstimer
+ Profil
diff --git a/client/src/interfaces/user.ts b/client/src/interfaces/user.ts
new file mode 100644
index 0000000..d7a844a
--- /dev/null
+++ b/client/src/interfaces/user.ts
@@ -0,0 +1,5 @@
+export interface User {
+ first_name: string
+ last_name: string
+ email: string
+}
\ No newline at end of file
diff --git a/client/src/router/index.ts b/client/src/router/index.ts
index cfd06ec..7d2dc9d 100644
--- a/client/src/router/index.ts
+++ b/client/src/router/index.ts
@@ -32,6 +32,14 @@ const router = createRouter({
// this generates a separate chunk (About.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: () => import('../views/trainer/Schedule.vue')
+ },
+ {
+ path: '/user/orders',
+ name: 'UserOrdersView',
+ // route level code-splitting
+ // this generates a separate chunk (About.[hash].js) for this route
+ // which is lazy-loaded when the route is visited.
+ component: () => import('../views/user/UserOrdersView.vue')
}
]
})
diff --git a/client/src/views/trainer/Schedule.vue b/client/src/views/trainer/Schedule.vue
index f0e9970..cc29bbc 100644
--- a/client/src/views/trainer/Schedule.vue
+++ b/client/src/views/trainer/Schedule.vue
@@ -42,7 +42,6 @@
grid-column-gap: 0px;
grid-row-gap: 0px;
width: fit-content;
- margin: auto;
font-size: 0.9em;
}
diff --git a/client/src/views/user/UserOrdersView.vue b/client/src/views/user/UserOrdersView.vue
new file mode 100644
index 0000000..8da791d
--- /dev/null
+++ b/client/src/views/user/UserOrdersView.vue
@@ -0,0 +1,23 @@
+
+
+ orders
+
+
+
+
+
+
\ No newline at end of file
diff --git a/server/src/routes/index.ts b/server/src/routes/index.ts
index d1115a7..2a07aa9 100644
--- a/server/src/routes/index.ts
+++ b/server/src/routes/index.ts
@@ -11,6 +11,7 @@ import createOrder from "./createOrder";
import orderNewTimeProposal from "./orderNewTimeProposal";
import orderNewTime from "./orderNewTime";
import order from "./order";
+import user from "./user";
import stripeWebhook from "./stripeWebhook";
import { bodyParserErrorHandler } from "../middlewares/bodyParserErrorHandler";
@@ -25,5 +26,6 @@ router.use(createOrder);
router.use(orderNewTimeProposal);
router.use(orderNewTime);
router.use(order);
+router.use(user);
export default router;
\ No newline at end of file
diff --git a/server/src/routes/user.ts b/server/src/routes/user.ts
new file mode 100644
index 0000000..daa70bd
--- /dev/null
+++ b/server/src/routes/user.ts
@@ -0,0 +1,38 @@
+import express, { Router, Request, Response } from "express";
+
+import { client } from "../db";
+import { DatabaseError } from "pg";
+import { UserAuth } from "../middlewares/auth";
+import { AuthedRequest } from "../interfaces/auth";
+
+const router: Router = express.Router();
+
+interface UserObject {
+ first_name: string
+ last_name: string
+ email: string
+ isAdmin: boolean
+ isTrainer: boolean
+}
+
+router.get("/user", UserAuth, async (req: AuthedRequest, res: Response) => {
+ try {
+ const databaseResult = await client.query(`
+ SELECT first_name, last_name, email, is_admin as isAdmin, trainers.user_id IS NOT NULL as isTrainer
+ FROM users
+ LEFT JOIN trainers ON trainers.user_id = users.id
+ WHERE users.id = $1;
+ `, [
+ req.user?.userId
+ ]);
+
+ const user: UserObject = databaseResult.rows[0];
+
+ return res.status(200).send(user);
+ } catch (error: DatabaseError | Error | any) {
+ console.error(error);
+ return res.sendStatus(500);
+ }
+})
+
+export default router;
\ No newline at end of file