chore: upload parte 1 - logica
DevSecOps Enterprise Pipeline / security-gate-and-deploy (push) Failing after 41s

This commit is contained in:
2026-06-01 15:35:53 +01:00
parent a63625d228
commit 9c14a19a87
127 changed files with 22255 additions and 0 deletions
+78
View File
@@ -0,0 +1,78 @@
import { NextRequest, NextResponse } from "next/server";
import { getDb } from "@/lib/db";
export async function PUT(
request: NextRequest,
{ params }: { params: Promise<{ id: string }> }
) {
const sql = getDb();
const { id } = await params;
const body = await request.json();
const {
part_number,
name,
description,
category_id,
manufacturer,
package_type,
unit_price,
stock_quantity,
min_stock_level,
datasheet_url,
supplier,
supplier_part_number,
shelf_location,
is_internal,
customer_supplied,
customer_id: cust_id,
specs,
} = body;
const rows = await sql(
`UPDATE components SET
part_number = $1, name = $2, description = $3, category_id = $4,
manufacturer = $5, package_type = $6, unit_price = $7, stock_quantity = $8,
min_stock_level = $9, datasheet_url = $10, supplier = $11, supplier_part_number = $12,
shelf_location = $13, is_internal = $14, customer_supplied = $15, customer_id = $16,
specs = $17, updated_at = NOW()
WHERE id = $18
RETURNING *`,
[
part_number,
name,
description || null,
category_id || null,
manufacturer || null,
package_type || null,
unit_price || 0,
stock_quantity || 0,
min_stock_level || 0,
datasheet_url || null,
supplier || null,
supplier_part_number || null,
shelf_location || null,
is_internal ?? false,
customer_supplied ?? false,
customer_supplied ? (cust_id || null) : null,
JSON.stringify(specs || {}),
Number(id),
]
);
if (rows.length === 0) {
return NextResponse.json({ error: "Component not found" }, { status: 404 });
}
return NextResponse.json(rows[0]);
}
export async function DELETE(
_request: NextRequest,
{ params }: { params: Promise<{ id: string }> }
) {
const sql = getDb();
const { id } = await params;
await sql(`DELETE FROM components WHERE id = $1`, [Number(id)]);
return NextResponse.json({ success: true });
}
+22
View File
@@ -0,0 +1,22 @@
import { NextRequest, NextResponse } from "next/server";
import { getDb } from "@/lib/db";
export async function GET(
_request: NextRequest,
{ params }: { params: Promise<{ id: string }> }
) {
const sql = getDb();
const { id } = await params;
const rows = await sql(
`SELECT bi.id, bi.quantity, bi.reference_designator, bi.notes,
p.id AS product_id, p.name AS product_name, p.sku, p.version, p.status
FROM bom_items bi
JOIN products p ON p.id = bi.product_id
WHERE bi.component_id = $1
ORDER BY p.name ASC, bi.reference_designator ASC`,
[Number(id)]
);
return NextResponse.json(rows);
}
+104
View File
@@ -0,0 +1,104 @@
import { NextRequest, NextResponse } from "next/server";
import { getDb } from "@/lib/db";
export async function GET(request: NextRequest) {
const sql = getDb();
const { searchParams } = new URL(request.url);
const search = searchParams.get("search") || "";
const category = searchParams.get("category") || "";
const lowStock = searchParams.get("lowStock") === "true";
const supplierName = searchParams.get("supplier_name") || "";
let query = `
SELECT c.*, cat.name as category_name,
cust.name as customer_name,
COALESCE((
SELECT SUM(spi.quantity - spi.received_quantity)
FROM supplier_po_items spi
JOIN supplier_pos sp ON sp.id = spi.supplier_po_id
WHERE spi.component_id = c.id
AND sp.status IN ('ordered', 'partially_received')
AND spi.quantity > spi.received_quantity
), 0)::int AS on_order
FROM components c
LEFT JOIN categories cat ON c.category_id = cat.id
LEFT JOIN customers cust ON c.customer_id = cust.id
WHERE 1=1
`;
const params: (string | number)[] = [];
if (search) {
params.push(`%${search}%`, `%${search}%`, `%${search}%`);
query += ` AND (c.name ILIKE $${params.length - 2} OR c.part_number ILIKE $${params.length - 1} OR c.manufacturer ILIKE $${params.length})`;
}
if (category) {
params.push(Number(category));
query += ` AND c.category_id = $${params.length}`;
}
if (lowStock) {
query += ` AND c.stock_quantity <= c.min_stock_level`;
}
if (supplierName) {
params.push(supplierName);
query += ` AND c.supplier = $${params.length}`;
}
query += ` ORDER BY c.updated_at DESC`;
const rows = await sql(query, params);
return NextResponse.json(rows);
}
export async function POST(request: NextRequest) {
const sql = getDb();
const body = await request.json();
const {
part_number,
name,
description,
category_id,
manufacturer,
package_type,
unit_price,
stock_quantity,
min_stock_level,
datasheet_url,
supplier,
supplier_part_number,
shelf_location,
is_internal,
customer_supplied,
customer_id,
specs,
} = body;
const rows = await sql(
`INSERT INTO components (part_number, name, description, category_id, manufacturer, package_type, unit_price, stock_quantity, min_stock_level, datasheet_url, supplier, supplier_part_number, shelf_location, is_internal, customer_supplied, customer_id, specs)
VALUES ($1, $2, $3, $4, $5, $6, $7, $8, $9, $10, $11, $12, $13, $14, $15, $16, $17)
RETURNING *`,
[
part_number,
name,
description || null,
category_id || null,
manufacturer || null,
package_type || null,
unit_price || 0,
stock_quantity || 0,
min_stock_level || 0,
datasheet_url || null,
supplier || null,
supplier_part_number || null,
shelf_location || null,
is_internal ?? false,
customer_supplied ?? false,
customer_supplied ? (customer_id || null) : null,
JSON.stringify(specs || {}),
]
);
return NextResponse.json(rows[0], { status: 201 });
}