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