IKHSAN
EN Read in EnglishID

pixies

Publik
Branch
master
Commit terakhir
9b0697f26 Oktober 2026

nodes.js

Buka raw
import express from 'express';
import * as nodes from '../controller/node.js';
import password from '../middlewares/password.js';
import { passwordHeaderNames, writePasswordHeaders } from '../util/passwordHeader.js';

const app = express.Router();

app.get("/", password(false), async (req, res) => {
    return res.json(await nodes.listAll());
});

app.put("/", password(false), async (req, res) => {
    if (process.env.PREVIEW_MODE === "true")
        return res.status(403).json({message: "For security reasons, you can't create nodes in preview mode"});

    if (!req.body.name || !req.body.url) return res.status(400).json({message: "Missing parameters", type: "MISSING_PARAMETERS"});

    const url = req.body.url.replace(/\/+$/, "");

    nodes.checkStatus(url, req.body.password).then(async (result) => {
        if (result === "INVALID_URL")
            return res.status(400).json({message: "Invalid URL", type: "INVALID_URL"});

        if (result === "PASSWORD_REQUIRED")
            return res.status(400).json({message: "Invalid password", type: "PASSWORD_REQUIRED"});

        res.json({id: (await nodes.create(req.body.name, url, req.body.password)).id, type: "NODE_CREATED"});
    });
});

app.delete("/:nodeId", password(false), async (req, res) => {
    if (process.env.PREVIEW_MODE === "true")
        return res.status(403).json({message: "For security reasons, you can't delete nodes in preview mode"});

    const node = await nodes.getOne(req.params.nodeId);
    if (node === null) return res.status(404).json({message: "Node not found"});

    await nodes.deleteNode(req.params.nodeId);
    res.json({message: "Node successfully deleted"});
});

app.patch("/:nodeId/name", password(false), async (req, res) => {
    if (process.env.PREVIEW_MODE === "true")
        return res.status(403).json({message: "For security reasons, you can't update nodes in preview mode"});

    if (!req.body.name) return res.status(400).json({message: "Missing parameters", type: "MISSING_PARAMETERS"});

    const node = await nodes.getOne(req.params.nodeId);
    if (node === null) return res.status(404).json({message: "Node not found"});

    await nodes.updateName(req.params.nodeId, req.body.name);
    res.json({message: "Node name successfully updated"});
});

app.patch("/:nodeId/password", password(false), async (req, res) => {
    if (process.env.PREVIEW_MODE === "true")
        return res.status(403).json({message: "For security reasons, you can't update nodes in preview mode"});

    if (!req.body.password) return res.status(400).json({message: "Missing parameters", type: "MISSING_PARAMETERS"});

    const node = await nodes.getOne(req.params.nodeId);
    if (node === null) return res.status(404).json({message: "Node not found"});

    nodes.checkStatus(node.url, req.body.password).then(async (result) => {
        if (result === "INVALID_URL")
            return res.status(400).json({message: "Invalid URL", type: "INVALID_URL"});

        if (result === "PASSWORD_REQUIRED")
            return res.status(400).json({message: "Invalid password", type: "PASSWORD_REQUIRED"});

        await nodes.updatePassword(req.params.nodeId, req.body.password === "none" ? null : req.body.password);
        res.json({message: "Node password successfully updated", type: "PASSWORD_UPDATED"});
    });
});

app.all("/:nodeId/*route", password(false), async (req, res) => {
    const node = await nodes.getOne(req.params.nodeId);
    if (node === null) return res.status(404).json({message: "Node not found"});

    const url = node.url + req.originalUrl.replace("/api/nodes/" + req.params.nodeId, "/api");

    passwordHeaderNames.forEach(name => delete req.headers[name]);
    Object.assign(req.headers, writePasswordHeaders(node.password));
    delete req.headers['host'];

    await nodes.proxyRequest(url, req, res);
});

export default app;
byte
3.863
baris
89
Jenis
js
Commit terakhir
26 Oktober 2026