first commit backend

This commit is contained in:
hoiruguci 2026-05-24 23:05:39 +07:00
commit b2bf4cefe1
13 changed files with 3242 additions and 0 deletions

5
.gitignore vendored Normal file
View File

@ -0,0 +1,5 @@
node_modules
# Keep environment variables out of version control
.env
/generated/prisma

23
app.js Normal file
View File

@ -0,0 +1,23 @@
const express = require("express");
const cors = require("cors");
const app = express();
app.use(cors());
app.use(express.json());
app.get("/", (req, res) => {
res.send("Backend aktif bro🚀");
});
const barangRoutes = require("./routes/barang");
const authRoutes = require("./routes/auth");
const bastRoutes = require("./routes/bast");
app.use("/barang", barangRoutes);
app.use("/auth", authRoutes);
app.use("/bast", bastRoutes);
app.listen(3000, "0.0.0.0", () => {
console.log("Server jalan di http://0.0.0.0:3000");
});

2865
package-lock.json generated Normal file

File diff suppressed because it is too large Load Diff

29
package.json Normal file
View File

@ -0,0 +1,29 @@
{
"name": "backend",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "",
"license": "ISC",
"type": "commonjs",
"dependencies": {
"@prisma/adapter-mariadb": "^7.8.0",
"@prisma/adapter-pg": "^7.8.0",
"@prisma/client": "^7.8.0",
"cors": "^2.8.6",
"dotenv": "^17.4.2",
"express": "^5.2.1",
"mysql2": "^3.22.3",
"pg": "^8.20.0"
},
"devDependencies": {
"@types/node": "^25.6.0",
"prisma": "^7.8.0",
"tsx": "^4.21.0",
"typescript": "^6.0.3"
}
}

10
prisma.config.ts Normal file
View File

@ -0,0 +1,10 @@
import "dotenv/config";
import { defineConfig } from "prisma/config";
export default defineConfig({
schema: "./prisma/schema.prisma",
datasource: {
url: process.env.DATABASE_URL,
},
});

18
prisma/client.js Normal file
View File

@ -0,0 +1,18 @@
require("dotenv").config();
const { PrismaClient } = require("@prisma/client");
const { PrismaMariaDb } = require("@prisma/adapter-mariadb");
const adapter = new PrismaMariaDb({
host: "sql.cifo.co.id",
port: 3307,
user: "pkl_bast",
password: "PklCifo2026",
database: "pkl_bast",
});
const prisma = new PrismaClient({
adapter,
});
module.exports = prisma;

View File

@ -0,0 +1,52 @@
-- CreateTable
CREATE TABLE `Kategori` (
`kategori_id` INTEGER NOT NULL AUTO_INCREMENT,
`kode_kategori` VARCHAR(191) NOT NULL,
`nama_kategori` VARCHAR(191) NOT NULL,
`deskripsi` VARCHAR(191) NULL,
PRIMARY KEY (`kategori_id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `Lokasi` (
`lokasi_id` INTEGER NOT NULL AUTO_INCREMENT,
`kode_lokasi` VARCHAR(191) NOT NULL,
`nama_lokasi` VARCHAR(191) NOT NULL,
`deskripsi` VARCHAR(191) NULL,
PRIMARY KEY (`lokasi_id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `Barang` (
`barang_id` INTEGER NOT NULL AUTO_INCREMENT,
`kode_barang` VARCHAR(191) NOT NULL,
`nama_barang` VARCHAR(191) NOT NULL,
`kategori_id` INTEGER NOT NULL,
`lokasi_id` INTEGER NOT NULL,
`status_barang` VARCHAR(191) NOT NULL,
PRIMARY KEY (`barang_id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- CreateTable
CREATE TABLE `BAST` (
`bast_id` INTEGER NOT NULL AUTO_INCREMENT,
`barang_id` INTEGER NOT NULL,
`user_serah_id` INTEGER NOT NULL,
`user_terima_id` INTEGER NOT NULL,
`status_serah` VARCHAR(191) NOT NULL,
`status_terima` VARCHAR(191) NOT NULL,
PRIMARY KEY (`bast_id`)
) DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
-- AddForeignKey
ALTER TABLE `Barang` ADD CONSTRAINT `Barang_kategori_id_fkey` FOREIGN KEY (`kategori_id`) REFERENCES `Kategori`(`kategori_id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `Barang` ADD CONSTRAINT `Barang_lokasi_id_fkey` FOREIGN KEY (`lokasi_id`) REFERENCES `Lokasi`(`lokasi_id`) ON DELETE RESTRICT ON UPDATE CASCADE;
-- AddForeignKey
ALTER TABLE `BAST` ADD CONSTRAINT `BAST_barang_id_fkey` FOREIGN KEY (`barang_id`) REFERENCES `Barang`(`barang_id`) ON DELETE RESTRICT ON UPDATE CASCADE;

View File

@ -0,0 +1,3 @@
# Please do not edit this file manually
# It should be added in your version-control system (e.g., Git)
provider = "mysql"

77
prisma/schema.prisma Normal file
View File

@ -0,0 +1,77 @@
generator client {
provider = "prisma-client-js"
}
datasource db {
provider = "mysql"
}
model Kategori {
kategori_id Int @id @default(autoincrement())
kode_kategori String? @unique(map: "kode_kategori") @db.VarChar(30)
nama_kategori String? @db.VarChar(100)
dibuat_pada DateTime? @default(now()) @db.DateTime(0)
barang Barang[]
}
model Lokasi {
lokasi_id Int @id @default(autoincrement())
kode_lokasi String? @unique(map: "kode_lokasi") @db.VarChar(50)
nama_lokasi String? @db.VarChar(100)
dibuat_pada DateTime? @default(now()) @db.DateTime(0)
barang Barang[]
}
model Barang {
barang_id Int @id @default(autoincrement())
kode_barang String @unique(map: "kode_barang") @db.VarChar(55)
nama_barang String @db.VarChar(125)
kategori_id Int?
lokasi_id Int?
status_barang Barang_status_barang? @default(Baik)
stok Int? @default(0)
dibuat_pada DateTime? @default(now()) @db.DateTime(0)
diubah_pada DateTime? @default(now()) @db.DateTime(0)
bast BAST[]
kategori Kategori? @relation(fields: [kategori_id], references: [kategori_id], onDelete: NoAction, onUpdate: NoAction, map: "Barang_ibfk_1")
lokasi Lokasi? @relation(fields: [lokasi_id], references: [lokasi_id], onDelete: NoAction, onUpdate: NoAction, map: "Barang_ibfk_2")
@@index([kategori_id], map: "kategori_id")
@@index([lokasi_id], map: "lokasi_id")
}
model BAST {
bast_id Int @id @default(autoincrement())
barang_id Int
user_serah_id Int
user_terima_id Int
status_serah String
status_terima String
file_export String? @db.VarChar(225)
dibuat_pada DateTime? @default(now()) @db.DateTime(0)
barang Barang @relation(fields: [barang_id], references: [barang_id])
@@index([barang_id], map: "BAST_barang_id_fkey")
}
model User {
user_id Int @id @default(autoincrement())
nama_lengkap String @db.VarChar(100)
username String @unique(map: "username") @db.VarChar(50)
password String @db.VarChar(255)
role User_role @default(User)
email String @db.VarChar(100)
lembaga String @db.VarChar(100)
}
enum User_role {
Admin
User
}
enum Barang_status_barang {
Baik
Rusak_Ringan @map("Rusak Ringan")
Rusak_Berat @map("Rusak Berat")
Hilang
}

23
routes/auth.js Normal file
View File

@ -0,0 +1,23 @@
const router = require("express").Router();
const { PrismaClient } = require("@prisma/client");
const prisma = require("../prisma/client");
router.post("/login", async (req, res) => {
const { username, password } = req.body;
const user = await prisma.user.findUnique({
where: { username }
});
if (!user || user.password !== password) {
return res.json({ message: "login gagal" });
}
res.json({
message: "login berhasil",
user
});
});
module.exports = router;

90
routes/barang.js Normal file
View File

@ -0,0 +1,90 @@
require("dotenv").config();
const router = require("express").Router();
const prisma = require("../prisma/client");
// GET ALL
router.get("/", async (req, res) => {
try {
const data = await prisma.barang.findMany({
include: {
kategori: true,
lokasi: true,
},
});
res.json(data);
} catch (error) {
res.status(500).json({
error: error.message,
});
}
});
// CREATE
router.post("/", async (req, res) => {
const {
kode_barang,
nama_barang,
kategori_id,
lokasi_id,
status_barang,
} = req.body;
try {
const data = await prisma.barang.create({
data: {
kode_barang,
nama_barang,
kategori_id,
lokasi_id,
status_barang,
},
});
res.json(data);
} catch (error) {
res.status(500).json({
error: error.message,
});
}
});
// UPDATE
router.put("/:id", async (req, res) => {
try {
const data = await prisma.barang.update({
where: {
barang_id: Number(req.params.id),
},
data: req.body,
});
res.json(data);
} catch (error) {
res.status(500).json({
error: error.message,
});
}
});
// DELETE
router.delete("/:id", async (req, res) => {
try {
await prisma.barang.delete({
where: {
barang_id: Number(req.params.id),
},
});
res.json({
message: "hapus berhasil",
});
} catch (error) {
res.status(500).json({
error: error.message,
});
}
});
module.exports = router;

33
routes/bast.js Normal file
View File

@ -0,0 +1,33 @@
const router = require("express").Router();
const { PrismaClient } = require("@prisma/client");
const prisma = require("../prisma/client");
router.post("/", async (req, res) => {
const data = await prisma.bAST.create({
data: {
...req.body,
status_serah: "Menunggu",
status_terima: "Menunggu"
}
});
res.json(data);
});
router.put("/approve-serah/:id", async (req, res) => {
const data = await prisma.bAST.update({
where: { bast_id: Number(req.params.id) },
data: { status_serah: "Approved" }
});
res.json(data);
});
router.put("/approve-terima/:id", async (req, res) => {
const data = await prisma.bAST.update({
where: { bast_id: Number(req.params.id) },
data: { status_terima: "Approved" }
});
res.json(data);
});
module.exports = router;

14
tsconfig.json Normal file
View File

@ -0,0 +1,14 @@
{
"compilerOptions": {
"target": "ES2020",
"module": "commonjs",
"moduleResolution": "node",
"strict": true,
"esModuleInterop": true,
"forceConsistentCasingInFileNames": true,
"resolveJsonModule": true,
"skipLibCheck": true,
"types": ["node"]
},
"include": ["prisma/**/*.ts", "**/*.ts"]
}