Files
simple-kurir/routes/user_router.ts

434 lines
13 KiB
TypeScript

import express from 'express';
import type { Request, Response } from 'express';
import PendafaranBaruModel from '../models/pendaftaran_baru_model';
import UserModel from '../models/user_model';
import KirimanModel from '../models/kiriman_model';
import KurirModel from '../models/kurir_model';
import type { UploadedFile } from 'express-fileupload';
import path from 'path';
import fs from 'fs';
import axios from 'axios';
import { socket_client } from '../index';
// import { io, Socket } from 'socket.io-client';
// const socket_client: Socket = io("http://localhost:3014");
const router = express.Router();
router.get('/', (req: Request, res: Response) => {
// socket_client.emit('scan_dia', 'test');
res.sendFile(__dirname + '/user_ui/index.html');
});
// router.get('/coba', async (req: Request, res: Response) => {
// res.status(200).json('success');
// })
router.get('/login', (req: Request, res: Response) => {
res.sendFile(__dirname + '/user_ui/login.html');
})
router.post('/login', async (req: Request, res: Response) => {
const { no_telpon, password } = req.body;
const user = await UserModel.findOne({ no_telpon, password });
if (user) {
console.log(user);
res.status(200).json(user);
return;
}
res.status(400).json('Nomor Telpon atau Password Salah');
})
router.get('/daftar', (req: Request, res: Response) => {
res.sendFile(__dirname + '/user_ui/daftar.html');
})
router.post('/daftar', async (req: Request, res: Response) => {
const { no_telpon, nama, password } = req.body;
// check the user
const user = await UserModel.findOne({ no_telpon });
if (user) {
res.status(400).json('Nomor Telpon sudah terdaftar');
return;
}
// check the pendaftaran baru
const pencarian_data = await PendafaranBaruModel.findOne({ no_telpon });
if (pencarian_data) {
// delete the pendaftaran baru with no_telpon
await PendafaranBaruModel.deleteOne({ no_telpon });
}
const otp = Math.floor(Math.random() * 1000000);
// create pendaftaran baru
// create a 6 otp random otp code
try {
const response = await axios.post('http://localhost:3012/send-otp', { number: no_telpon, otp });
const pendaftaran_baru = new PendafaranBaruModel({ no_telpon, nama, password, otp });
await pendaftaran_baru.save();
res.status(200).json('success');
return;
} catch (error: any) {
// console.log(error);
res.status(error.response.status).json(error.response.data);
return
}
// res.status(400).json('error dari backend');
});
router.post('/verifikasi', async (req: Request, res: Response) => {
const { no_telpon, kode_otp } = req.body;
const pencarian_data = await PendafaranBaruModel.findOne({ no_telpon });
if (!pencarian_data) {
res.status(400).json('Nomor Telpon tidak ditemukan');
return;
}
if (pencarian_data.otp == kode_otp) {
const user = new UserModel({ no_telpon, nama: pencarian_data.nama, password: pencarian_data.password });
await user.save();
await PendafaranBaruModel.deleteOne({ no_telpon });
res.status(200).json('success');
return;
}
res.status(400).json('Kode OTP Salah');
return
})
router.get('/user', (req: Request, res: Response) => {
res.sendFile(__dirname + '/user_after_login_ui/index.html');
})
router.get('/user/gambar/:id/:gambar', (req: Request, res: Response) => {
const { id, gambar } = req.params;
// console.log(id, gambar);
const gambarPath = path.join(__dirname, '../images/user/' + id + '/' + gambar);
res.sendFile(gambarPath);
})
router.put('/user/:_id', async (req: Request, res: Response) => {
const { _id } = req.params;
const { nama, alamat, ada_file } = req.body;
let gambar_name = "";
if (ada_file > 0) {
const { gambar } = req.files as { gambar: UploadedFile };
// console.log(gambar);
const userDir = path.join(__dirname, '../images/user/' + _id);
if (!fs.existsSync(userDir)) {
fs.mkdirSync(userDir);
}
// delete all file on userDir
const files = fs.readdirSync(userDir);
for (const file of files) {
fs.unlinkSync(path.join(userDir, file));
}
const gambarPath = path.join(userDir, gambar.name);
gambar_name = gambar.name;
// console.log(gambarPath);
await gambar.mv(gambarPath);
}
const response = await UserModel.findOneAndUpdate({ _id }, { $set: { nama, alamat, gambar: gambar_name } }, { new: true });
console.log(response);
res.status(200).json(response);
})
router.get('/user/kirim-paket', async (req: Request, res: Response) => {
res.sendFile(__dirname + '/user_after_login_ui/paket.html');
})
router.post('/user/kirim-paket', async (req: Request, res: Response) => {
const { _id, no_telpon_pengirim, nama_pengirim, alamat_pengirim, no_telpon_penerima, nama_penerima, alamat_penerima } = req.body;
const { gambar_paket } = req.files as { gambar_paket: UploadedFile };
const userNoTelpon = (await UserModel.findOne({ _id }).select('no_telpon'))?.no_telpon;
// console.log(userNoTelpon);
const newKiriman = new KirimanModel({ id_pengirim: _id, no_telpon_pengirim, nama_pengirim, alamat_pengirim, no_telpon_penerima, nama_penerima, alamat_penerima, gambar_paket: gambar_paket.name });
await newKiriman.save();
// console.log(newKiriman);
const gambarPath = path.join(__dirname, '../images/kiriman/' + newKiriman._id + '/' + gambar_paket.name);
await gambar_paket.mv(gambarPath);
const message = `Pengiriman anda dengan nomor resi ${newKiriman._id} sedang diproses oleh admin.`;
try {
await axios.post('http://localhost:3012/send-message', { number: userNoTelpon, message: message });
} catch (error) {
console.log(error);
}
socket_client.emit('pengiriman_baru_server');
res.status(200).json("ini kirim paket")
})
router.get("/user/paket/:id/:status", async (req: Request, res: Response) => {
try {
const { id, status } = req.params;
console.log(id);
let response
if (status == "paket") {
// check where status is not "Dibatalkan Oleh Admin"
response = await KirimanModel.find({
id_pengirim: id,
status: {
$nin: ['Dibatalkan Oleh Admin', 'Diterima Terverifikasi',"Dibatalkan Oleh Pengirim"],
$type: 'string'
}
});
} else {
response = await KirimanModel.find({ id_pengirim: id });
}
console.log(response);
res.status(200).json(response);
} catch (error) {
console.log(error);
res.status(400).json([]);
}
})
router.get("/user/paket-detail/:id", async (req: Request, res: Response) => {
const { id } = req.params;
console.log(id);
try {
const response = await KirimanModel.findOne({ _id: id }).lean();
if (!response) {
res.status(404).json("Data tidak ditemukan");
return;
}
let responseWithKurir = {};
if (response.id_kurir) {
const kurirData = await KurirModel.findOne({ _id: response.id_kurir });
responseWithKurir = {
...response,
nama_kurir: kurirData?.nama,
no_telpon_kurir: kurirData?.no_telpon
};
console.log(responseWithKurir);
}
// await 2 sec
// await new Promise((resolve) => setTimeout(resolve, 2000));
res.status(200).json(response.id_kurir ? responseWithKurir : response);
} catch (error) {
console.log(error);
res.status(400).json("error menampilkan data");
}
})
router.get("/user/paket-detail/:id/:gambar", async (req: Request, res: Response) => {
let { id, gambar } = req.params;
// console.log(id , gambar);
try {
const response = await KirimanModel.findOne({ _id: id, gambar_paket: gambar });
const gambarPath = path.join(__dirname, '../images/kiriman/' + id + '/' + gambar);
res.sendFile(gambarPath);
// await 2 sec
// await new Promise((resolve) => setTimeout(resolve, 2000));
// res.status(200).json(response);
} catch (error) {
console.log(error);
res.status(400).json("error menampilkan data");
}
// res.status(200).json("success");
})
router.get('/user/profil', (req: Request, res: Response) => {
res.sendFile(__dirname + '/user_after_login_ui/profil.html');
})
router.post('/user/check', async (req: Request, res: Response) => {
if (!req.body) {
res.status(400).json('Bad Request');
return;
}
const { _id, no_telpon, password, createdAt } = req.body;
// console.log(_id , no_telpon , password , createdAt);
try {
// check the user by _id , no_telpon , password , createdAt
const user = await UserModel.findOne({ _id, no_telpon, password, createdAt });
if (!user) {
res.status(400).json('User not found');
return;
}
res.status(200).json('Success');
return;
} catch (error) {
console.log(error);
res.status(500).json('Terjadi Kesalahan Server');
return
}
})
router.get('/user/cek-kurir/:id', async (req: Request, res: Response) => {
const { id } = req.params;
console.log(id);
if (!id) {
res.status(400).json('Bad Request');
return;
}
// res.status(200).json('Success');
try {
const kurir = await KurirModel.findOne({ _id: id });
// console.log(kurir);
if (!kurir) {
res.status(400).json('Kurir not found');
return;
}
res.status(200).json(kurir);
return;
} catch (error) {
console.log(error);
res.status(500).json('Terjadi Kesalahan Server');
return
}
})
router.get('/user/kurir/gambar/:no_telpon/:jenis', (req: Request, res: Response) => {
const { no_telpon, jenis } = req.params;
if (!no_telpon) {
res.status(400).json({ error: 'No Telpon is required.' });
return
}
KurirModel.findOne({ no_telpon }).then((data) => {
// if data not found
if (!data) {
res.status(404).json({ error: 'Kurir not found.' });
return
}
// Define file paths
const motorGambar = path.join(__dirname, '../images/' + jenis + '/' + data.gambar_motor);
const kurirGambar = path.join(__dirname, '../images/kurir/' + data.gambar_kurir);
if (jenis == 'motor') {
res.sendFile(motorGambar);
} else {
res.sendFile(kurirGambar);
}
})
})
router.post('/user/terima-paket/:id_kiriman', async (req: Request, res: Response) => {
const { id_kiriman } = req.params;
const { id_pengirim } = req.body;
console.log(id_kiriman, id_pengirim);
if (!id_kiriman || !id_pengirim) {
res.status(400).json('Bad Request');
return;
}
// cek the kiriman by id : id_kiriman , id_pengirim : id_pengirim
const kiriman = await KirimanModel.findOne({ _id: id_kiriman, id_pengirim });
if (!kiriman) {
res.status(400).json('Kiriman not found');
return;
}
try {
const updatedDoc = await KirimanModel.findOneAndUpdate({ _id: id_kiriman }, {
$set: {
status: 'Diterima Terverifikasi'
},
$push: {
timeline: {
status: 'Diterima Terverifikasi',
waktu: new Date(),
// alasan: alasan || null,
id_kurir: kiriman.id_kurir
}
}
}, { new: true });
console.log(updatedDoc, "diterima terverifikasi");
socket_client.emit('diterima_terverifikasi', updatedDoc);
res.status(200).json('Success');
} catch (error) {
console.log(error);
res.status(500).json('Terjadi Kesalahan Server');
}
})
router.delete('/user/delete-paket/:id_kiriman', async (req: Request, res: Response) => {
const { id_kiriman } = req.params;
const { id_pengirim } = req.body;
if (!id_kiriman || !id_pengirim) {
res.status(400).json('Bad Request');
return;
}
// search by id : id_kiriman , id_pengirim : id_pengirim
const kirimanData = await KirimanModel.findOne({ _id: id_kiriman, id_pengirim });
if (!kirimanData) {
res.status(400).json('Kiriman not found');
return;
}
try {
// delete the kiriman
const deletedDoc = await KirimanModel.findOneAndUpdate({ _id: id_kiriman }, {
$set: {
status: 'Dibatalkan Oleh Pengirim'
},
$push: {
timeline: {
status: 'Dibatalkan Oleh Pengirim',
waktu: new Date(),
// alasan: alasan || null,
id_kurir: kirimanData.id_kurir
}
}
}, { new: true });
socket_client.emit('delete_kiriman', deletedDoc);
res.status(200).json('Success');
} catch (error) {
console.log(error);
res.status(500).json('Terjadi Kesalahan Server');
}
})
router.get('/user/history', async (req: Request, res: Response) => {
res.sendFile(__dirname + '/user_after_login_ui/history.html');
})
// This should be the last route
router.use((req: Request, res: Response) => {
res.status(404).sendFile(__dirname + '/user_ui/404.html');
});
export default router;