|
|
|
@ -1,10 +1,6 @@
|
|
|
|
import express, { Router, Response } from "express";
|
|
|
|
import express, { Router, Response } from "express";
|
|
|
|
import Joi from "joi"
|
|
|
|
import Joi from "joi"
|
|
|
|
import dayjs, { Dayjs } from "dayjs"
|
|
|
|
import dayjs, { Dayjs } from "dayjs"
|
|
|
|
import isoWeek from "dayjs/plugin/isoWeek"
|
|
|
|
|
|
|
|
import utc from "dayjs/plugin/utc"
|
|
|
|
|
|
|
|
import LocalizedFormat from "dayjs/plugin/localizedFormat"
|
|
|
|
|
|
|
|
import { } from "dayjs/locale/da";
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
import { client as pool } from "../db";
|
|
|
|
import { client as pool } from "../db";
|
|
|
|
import { DatabaseError } from "pg";
|
|
|
|
import { DatabaseError } from "pg";
|
|
|
|
@ -15,10 +11,10 @@ import Stripe from 'stripe';
|
|
|
|
import { stripe } from "../stripe";
|
|
|
|
import { stripe } from "../stripe";
|
|
|
|
import Trainer from "../interfaces/trainer";
|
|
|
|
import Trainer from "../interfaces/trainer";
|
|
|
|
import { baseURL } from "../environment";
|
|
|
|
import { baseURL } from "../environment";
|
|
|
|
|
|
|
|
import { sendOrderConfirmationEmail } from "../mail/orderConfirmation";
|
|
|
|
dayjs.extend(isoWeek)
|
|
|
|
import User from "../interfaces/user";
|
|
|
|
dayjs.extend(utc)
|
|
|
|
import { Order } from "../interfaces/order";
|
|
|
|
dayjs.extend(LocalizedFormat);
|
|
|
|
import { formatDate, formatTime } from "../utils/dates";
|
|
|
|
|
|
|
|
|
|
|
|
const router: Router = express.Router();
|
|
|
|
const router: Router = express.Router();
|
|
|
|
|
|
|
|
|
|
|
|
@ -39,21 +35,6 @@ interface TimeslotValidQueryResult {
|
|
|
|
time_already_reserved: boolean
|
|
|
|
time_already_reserved: boolean
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
function formatDate(date: Dayjs): string {
|
|
|
|
|
|
|
|
let output: string = dayjs(date).locale("da").format("dddd D. MMM YYYY");
|
|
|
|
|
|
|
|
let outputStringArray = output.split("");
|
|
|
|
|
|
|
|
outputStringArray[0] = outputStringArray[0].toLocaleUpperCase();
|
|
|
|
|
|
|
|
output = outputStringArray.join("");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return output;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
function formatTime(date: Dayjs): string {
|
|
|
|
|
|
|
|
let output: string = dayjs(date).locale("da").format("HH:mm");
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
return output;
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
router.post("/order", UserAuth, async (req: AuthedRequest, res: Response) => {
|
|
|
|
router.post("/order", UserAuth, async (req: AuthedRequest, res: Response) => {
|
|
|
|
try {
|
|
|
|
try {
|
|
|
|
const client = await pool.connect();
|
|
|
|
const client = await pool.connect();
|
|
|
|
@ -137,13 +118,18 @@ router.post("/order", UserAuth, async (req: AuthedRequest, res: Response) => {
|
|
|
|
type: "startDate.invalid"
|
|
|
|
type: "startDate.invalid"
|
|
|
|
}]);
|
|
|
|
}]);
|
|
|
|
|
|
|
|
|
|
|
|
const emailQuery = await client.query(`
|
|
|
|
const userQuery = await client.query(`
|
|
|
|
SELECT email FROM users WHERE id = $1;
|
|
|
|
SELECT
|
|
|
|
|
|
|
|
id,
|
|
|
|
|
|
|
|
email,
|
|
|
|
|
|
|
|
first_name,
|
|
|
|
|
|
|
|
last_name
|
|
|
|
|
|
|
|
FROM users WHERE id = $1;
|
|
|
|
`, [
|
|
|
|
`, [
|
|
|
|
req.user?.userId
|
|
|
|
req.user?.userId
|
|
|
|
]);
|
|
|
|
]);
|
|
|
|
|
|
|
|
|
|
|
|
const email: string = emailQuery.rows[0].email;
|
|
|
|
const user: User = userQuery.rows[0];
|
|
|
|
|
|
|
|
|
|
|
|
const priceQuery = await client.query(`
|
|
|
|
const priceQuery = await client.query(`
|
|
|
|
SELECT hourly_price FROM trainers WHERE id = $1;
|
|
|
|
SELECT hourly_price FROM trainers WHERE id = $1;
|
|
|
|
@ -177,7 +163,7 @@ router.post("/order", UserAuth, async (req: AuthedRequest, res: Response) => {
|
|
|
|
mode: 'payment',
|
|
|
|
mode: 'payment',
|
|
|
|
success_url: `${baseURL}/user/orders`,
|
|
|
|
success_url: `${baseURL}/user/orders`,
|
|
|
|
cancel_url: `${baseURL}`,
|
|
|
|
cancel_url: `${baseURL}`,
|
|
|
|
customer_email: email
|
|
|
|
customer_email: user.email
|
|
|
|
});
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
const insertQuery = await client.query(`
|
|
|
|
const insertQuery = await client.query(`
|
|
|
|
@ -190,7 +176,7 @@ router.post("/order", UserAuth, async (req: AuthedRequest, res: Response) => {
|
|
|
|
INSERT INTO orders (timeslot_id, user_id, price, checkout_session)
|
|
|
|
INSERT INTO orders (timeslot_id, user_id, price, checkout_session)
|
|
|
|
select id, $4, $5, $6
|
|
|
|
select id, $4, $5, $6
|
|
|
|
FROM inserted_reserved_timeslot
|
|
|
|
FROM inserted_reserved_timeslot
|
|
|
|
RETURNING id;
|
|
|
|
RETURNING id, created_at;
|
|
|
|
`, [
|
|
|
|
`, [
|
|
|
|
orderBody.trainer,
|
|
|
|
orderBody.trainer,
|
|
|
|
startDate,
|
|
|
|
startDate,
|
|
|
|
@ -202,10 +188,20 @@ router.post("/order", UserAuth, async (req: AuthedRequest, res: Response) => {
|
|
|
|
|
|
|
|
|
|
|
|
const insertedData = insertQuery.rows[0];
|
|
|
|
const insertedData = insertQuery.rows[0];
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
const order: Order = {
|
|
|
|
|
|
|
|
id: insertedData.id,
|
|
|
|
|
|
|
|
startDate: orderBody.startDate,
|
|
|
|
|
|
|
|
endDate: orderBody.endDate,
|
|
|
|
|
|
|
|
status: "Processing",
|
|
|
|
|
|
|
|
price,
|
|
|
|
|
|
|
|
trainer,
|
|
|
|
|
|
|
|
created_at: insertedData.created_at
|
|
|
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
|
|
await client.query("COMMIT");
|
|
|
|
await client.query("COMMIT");
|
|
|
|
|
|
|
|
|
|
|
|
return res.status(200).send({
|
|
|
|
return res.status(200).send({
|
|
|
|
id: insertedData.id,
|
|
|
|
id: order.id,
|
|
|
|
trainerId: orderBody.trainer,
|
|
|
|
trainerId: orderBody.trainer,
|
|
|
|
startDate: orderBody.startDate,
|
|
|
|
startDate: orderBody.startDate,
|
|
|
|
endDate: orderBody.endDate,
|
|
|
|
endDate: orderBody.endDate,
|
|
|
|
|