first commit backend
This commit is contained in:
commit
b2bf4cefe1
|
|
@ -0,0 +1,5 @@
|
||||||
|
node_modules
|
||||||
|
# Keep environment variables out of version control
|
||||||
|
.env
|
||||||
|
|
||||||
|
/generated/prisma
|
||||||
|
|
@ -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");
|
||||||
|
});
|
||||||
File diff suppressed because it is too large
Load Diff
|
|
@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
@ -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;
|
||||||
|
|
@ -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;
|
||||||
|
|
@ -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"
|
||||||
|
|
@ -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
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
|
@ -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;
|
||||||
|
|
@ -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;
|
||||||
|
|
@ -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"]
|
||||||
|
}
|
||||||
Loading…
Reference in New Issue