115 lines
3.0 KiB
TypeScript
115 lines
3.0 KiB
TypeScript
import axios from "axios";
|
|
import { type DrizzleError, sql } from "drizzle-orm";
|
|
import type { Request, Response } from "express";
|
|
import { Router } from "express";
|
|
import https from "https";
|
|
import { db } from "../../../../pkg/db/db.js";
|
|
import {
|
|
forkliftCompanies,
|
|
insertForkliftCompanySchema,
|
|
} from "../../../../pkg/db/schema/forkliftLeaseCompanys.js";
|
|
import { createLogger } from "../../../../pkg/logger/logger.js";
|
|
import { tryCatch } from "../../../../pkg/utils/tryCatch.js";
|
|
|
|
const router = Router();
|
|
|
|
router.post("/", async (req: Request, res: Response) => {
|
|
// when a new server is posted from localhost or 127.0.0.1 we also want to post it to the test server so we can see it from there
|
|
//res.status(200).json({ message: "Server added", ip: req.hostname });
|
|
const log = createLogger({ module: "forklift", subModule: "add company" });
|
|
const parsed = insertForkliftCompanySchema.safeParse(req.body);
|
|
|
|
if (!parsed.success) {
|
|
return res.status(400).json({ errors: parsed.error.flatten() });
|
|
}
|
|
|
|
const { data, error } = await tryCatch(
|
|
db
|
|
.insert(forkliftCompanies)
|
|
.values({
|
|
...parsed.data,
|
|
add_user: req.user?.username,
|
|
add_date: sql`NOW()`,
|
|
upd_user: req.user?.username,
|
|
upd_date: sql`NOW()`,
|
|
})
|
|
.onConflictDoUpdate({
|
|
target: forkliftCompanies.name,
|
|
set: {
|
|
...parsed.data,
|
|
add_user: req.user?.username,
|
|
add_date: sql`NOW()`,
|
|
upd_user: req.user?.username,
|
|
upd_date: sql`NOW()`,
|
|
},
|
|
})
|
|
.returning({
|
|
name: forkliftCompanies.name,
|
|
}),
|
|
);
|
|
|
|
if (error) {
|
|
const err: DrizzleError = error;
|
|
return res.status(400).json({
|
|
message: `Error adding the server`,
|
|
error: err.cause,
|
|
});
|
|
}
|
|
|
|
if (req.hostname === "localhost" && process.env.MAIN_SERVER) {
|
|
log.info({}, "Running in dev server about to add in a new server");
|
|
const axiosInstance = axios.create({
|
|
httpsAgent: new https.Agent({ rejectUnauthorized: false }),
|
|
baseURL: process.env.MAIN_SERVER, // e.g. "https://example.com"
|
|
withCredentials: true,
|
|
});
|
|
|
|
const loginRes = (await axiosInstance.post(
|
|
`${process.env.MAIN_SERVER}/lst/api/auth/sign-in/username`,
|
|
{
|
|
username: process.env.MAIN_SERVER_USERNAME,
|
|
password: process.env.MAIN_SERVER_PASSWORD,
|
|
},
|
|
{
|
|
headers: { "Content-Type": "application/json" },
|
|
},
|
|
)) as any;
|
|
const setCookie = loginRes.headers["set-cookie"][0];
|
|
|
|
if (!setCookie) {
|
|
throw new Error("Did not receive a Set-Cookie header from login");
|
|
}
|
|
|
|
const { data, error } = await tryCatch(
|
|
axios.post(
|
|
`${process.env.MAIN_SERVER}/lst/api/forklifts/companies`,
|
|
parsed.data,
|
|
{
|
|
headers: {
|
|
"Content-Type": "application/json",
|
|
Cookie: setCookie.split(";")[0],
|
|
},
|
|
withCredentials: true,
|
|
},
|
|
),
|
|
);
|
|
|
|
if (error) {
|
|
log.error(
|
|
{ stack: error },
|
|
"There was an error adding the company to Main Server",
|
|
);
|
|
}
|
|
log.info(
|
|
{ stack: data?.data },
|
|
"A new Company was just added to the server.",
|
|
);
|
|
}
|
|
|
|
return res
|
|
.status(201)
|
|
.json({ message: `Server ${data[0]?.name} added`, data: data });
|
|
});
|
|
|
|
export default router;
|