70 lines
1.6 KiB
JavaScript
70 lines
1.6 KiB
JavaScript
import dotenv from "dotenv";
|
|
import e from "express";
|
|
import z from "zod";
|
|
|
|
import { execa } from "execa";
|
|
|
|
dotenv.config();
|
|
|
|
const PORT = process.env.PORT || 3000;
|
|
const CONTAINER = process.env.CONTAINER || "mailserver";
|
|
const INVITE_CODE = process.env.INVITE_CODE;
|
|
const DOMAIN = process.env.DOMAIN;
|
|
|
|
const RegisterSchema = z.object({
|
|
invite: z.literal(INVITE_CODE, "ŠPATNÝ KÓD, GÓJI."),
|
|
username: z
|
|
.string()
|
|
.trim()
|
|
.regex(
|
|
/^[a-zA-Z0-9]([a-zA-Z0-9._-]{0,62}[a-zA-Z0-9])?$/,
|
|
"Neplatný formát jména."
|
|
)
|
|
.transform((s) => s.toLowerCase()),
|
|
password: z
|
|
.string()
|
|
.trim()
|
|
.min(8, "Heslo by mělo mít aspoň 8 znaků.")
|
|
.regex(/^[^\s]+$/, "Heslo prosím bez mezer."),
|
|
});
|
|
|
|
const app = e();
|
|
|
|
app.use(e.urlencoded({ extended: true }));
|
|
app.use(e.static("public"));
|
|
|
|
app.post("/register", async (req, res) => {
|
|
const result = RegisterSchema.safeParse(req.body);
|
|
|
|
if (!result.success) {
|
|
return res
|
|
.status(400)
|
|
.send(`Tvůj požadavek je neplatný: ${result.error.issues[0].message}`);
|
|
}
|
|
|
|
const email = `${result.data.username}@${DOMAIN}`;
|
|
const password = result.data.password;
|
|
|
|
try {
|
|
await execa(
|
|
"docker",
|
|
["exec", "-i", CONTAINER, "setup", "email", "add", email, password],
|
|
{ timeout: 10000 }
|
|
);
|
|
|
|
res.send(
|
|
`VÍTEJ V TAJNÉM ELITNÍM KLUBU. Tvůj nový profesionální e-mail je ${email}.`
|
|
);
|
|
} catch (err) {
|
|
console.error("CHYBA:", err.stderr || err.message);
|
|
|
|
res
|
|
.status(500)
|
|
.send(
|
|
"Buď se něco rozbilo nebo tento e-mail už existuje. Kdyžtak si postěžuj sneedNEGROVI."
|
|
);
|
|
}
|
|
});
|
|
|
|
app.listen(PORT);
|