create-cactus 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/index.js +31 -0
- package/package.json +26 -0
- package/template/backend-project/.env +2 -0
- package/template/backend-project/1.drawio +392 -0
- package/template/backend-project/controllers/productsController.js +17 -0
- package/template/backend-project/controllers/reportController.js +59 -0
- package/template/backend-project/controllers/stocktransactionController.js +70 -0
- package/template/backend-project/controllers/userController.js +112 -0
- package/template/backend-project/controllers/warehouseController.js +17 -0
- package/template/backend-project/db/connectDb.js +12 -0
- package/template/backend-project/middleware/authMiddleware.js +15 -0
- package/template/backend-project/models/products.js +13 -0
- package/template/backend-project/models/stocktransaction.js +17 -0
- package/template/backend-project/models/user.js +10 -0
- package/template/backend-project/models/warehouse.js +10 -0
- package/template/backend-project/package-lock.json +1563 -0
- package/template/backend-project/package.json +24 -0
- package/template/backend-project/routes/productsRoutes.js +11 -0
- package/template/backend-project/routes/reportRoutes.js +8 -0
- package/template/backend-project/routes/stocktransactionRoutes.js +13 -0
- package/template/backend-project/routes/userRoutes.js +14 -0
- package/template/backend-project/routes/warehouseRoutes.js +9 -0
- package/template/backend-project/server.js +29 -0
- package/template/frontend-project/README.md +16 -0
- package/template/frontend-project/eslint.config.js +21 -0
- package/template/frontend-project/index.html +13 -0
- package/template/frontend-project/package-lock.json +3050 -0
- package/template/frontend-project/package.json +31 -0
- package/template/frontend-project/public/download.jpg +0 -0
- package/template/frontend-project/public/favicon.svg +1 -0
- package/template/frontend-project/public/icons.svg +24 -0
- package/template/frontend-project/src/App.jsx +31 -0
- package/template/frontend-project/src/api/api.js +13 -0
- package/template/frontend-project/src/assets/hero.png +0 -0
- package/template/frontend-project/src/assets/react.svg +1 -0
- package/template/frontend-project/src/assets/vite.svg +1 -0
- package/template/frontend-project/src/index.css +1 -0
- package/template/frontend-project/src/layout/Pagelayout.jsx +23 -0
- package/template/frontend-project/src/main.jsx +10 -0
- package/template/frontend-project/src/pages/Dashboard.jsx +10 -0
- package/template/frontend-project/src/pages/Login.jsx +54 -0
- package/template/frontend-project/src/pages/Product.jsx +48 -0
- package/template/frontend-project/src/pages/Register.jsx +61 -0
- package/template/frontend-project/src/pages/Reports.jsx +84 -0
- package/template/frontend-project/src/pages/Transactions.jsx +49 -0
- package/template/frontend-project/src/pages/Warehouse.jsx +39 -0
- package/template/frontend-project/vite.config.js +8 -0
|
@@ -0,0 +1,112 @@
|
|
|
1
|
+
import jwt from "jsonwebtoken";
|
|
2
|
+
import user from "../models/user.js";
|
|
3
|
+
import bcryptjs from 'bcryptjs'
|
|
4
|
+
|
|
5
|
+
|
|
6
|
+
|
|
7
|
+
export const signup=async(req,res)=>{
|
|
8
|
+
try {
|
|
9
|
+
const{UserId,username,email,password}=req.body;
|
|
10
|
+
const userExists=await user.findOne({email});
|
|
11
|
+
|
|
12
|
+
if(userExists){
|
|
13
|
+
return res.status(400).json({message:"user already exists"});
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
const hashed= await bcryptjs.hash(password,10);
|
|
17
|
+
|
|
18
|
+
await new user({UserId,username,email,password:hashed}).save();
|
|
19
|
+
|
|
20
|
+
res.status(201).json({message:"user created successfully"});
|
|
21
|
+
} catch (error) {
|
|
22
|
+
res.status(500).json({message:"internal server error",error:error.message})
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
|
|
27
|
+
|
|
28
|
+
export const login=async(req,res)=>{
|
|
29
|
+
try {
|
|
30
|
+
const{email,password}=req.body;
|
|
31
|
+
const userExists=await user.findOne({email});
|
|
32
|
+
|
|
33
|
+
if(!userExists){
|
|
34
|
+
return res.status(404).json({message:"user not found"});
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
const verifypassword=await bcryptjs.compare(password,userExists.password)
|
|
38
|
+
|
|
39
|
+
if(!verifypassword){
|
|
40
|
+
return res.status(404).json({message:"wrong password"});
|
|
41
|
+
}
|
|
42
|
+
const token=jwt.sign({UserId:userExists.UserId,email:userExists.email},"secretkey",{expiresIn:"1d"})
|
|
43
|
+
res.status(200).json({message:"user logged in successfully",token})
|
|
44
|
+
|
|
45
|
+
|
|
46
|
+
} catch (error) {
|
|
47
|
+
res.status(500).json({message:"internal server error",error:error.message})
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
export const getAllProfiles=async(req,res)=>{
|
|
52
|
+
try {
|
|
53
|
+
const userExists= await user.find()
|
|
54
|
+
if(!userExists){
|
|
55
|
+
return res.status(404).json({message:"no users found"})
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
res.status(200).json(userExists)
|
|
59
|
+
} catch (error) {
|
|
60
|
+
res.status(500).json({message:"internal server error",error:error.message})
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
|
|
65
|
+
export const getProfile=async(req,res)=>{
|
|
66
|
+
try {
|
|
67
|
+
const userExists= await user.findById(req.params.id);
|
|
68
|
+
if(!userExists){
|
|
69
|
+
return res.status(404).json({mesage:"user not found"});
|
|
70
|
+
}
|
|
71
|
+
|
|
72
|
+
res.status(200).json({user:{
|
|
73
|
+
id:userExists.id,
|
|
74
|
+
names:userExists.username,
|
|
75
|
+
email:userExists.email
|
|
76
|
+
}})
|
|
77
|
+
} catch (error) {
|
|
78
|
+
res.status(500).json({message:"internal server error",error:error.message})
|
|
79
|
+
}
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
|
|
83
|
+
export const updateUser=async(req,res)=>{
|
|
84
|
+
try{
|
|
85
|
+
const{names,email}=req.body;
|
|
86
|
+
const userExists=await user.findByIdAndUpdate(req.params.id,req.body,{new:true}
|
|
87
|
+
);
|
|
88
|
+
if (!userExists) {
|
|
89
|
+
return res.status(404).json({message:"user not found"})
|
|
90
|
+
|
|
91
|
+
}
|
|
92
|
+
res.status(200).json(userExists)
|
|
93
|
+
|
|
94
|
+
} catch(error){
|
|
95
|
+
res.status(500).json({message:"internal server error",error:error.message})
|
|
96
|
+
|
|
97
|
+
}
|
|
98
|
+
};
|
|
99
|
+
|
|
100
|
+
|
|
101
|
+
export const deleteUser=async(req,res)=>{
|
|
102
|
+
try {
|
|
103
|
+
const userExists=await user.findByIdAndDelete(req.params.id)
|
|
104
|
+
if(!userExists){
|
|
105
|
+
return res.status(404).json({message:"user not found"})
|
|
106
|
+
|
|
107
|
+
}
|
|
108
|
+
res.status(200).json({message:"user deleted successfully"})
|
|
109
|
+
} catch (error) {
|
|
110
|
+
res.status(500).json({message:"internal server error",error:error.message})
|
|
111
|
+
}
|
|
112
|
+
}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import warehouse from "../models/warehouse.js";
|
|
2
|
+
|
|
3
|
+
export const addWareHouse=async(req,res)=>{
|
|
4
|
+
try {
|
|
5
|
+
const{WarehouseCode,WarehouseName,WarehouseLocation}=req.body;
|
|
6
|
+
const warehouseExists=await warehouse.findOne({WarehouseCode});
|
|
7
|
+
|
|
8
|
+
if(warehouseExists){
|
|
9
|
+
return res.status(400).json({message:"warehouse already exists"});
|
|
10
|
+
}
|
|
11
|
+
|
|
12
|
+
await new warehouse({WarehouseCode,WarehouseName,WarehouseLocation}).save();
|
|
13
|
+
res.status(201).json({message:"new warehouse added"})
|
|
14
|
+
} catch (error) {
|
|
15
|
+
res.status(500).json({message:"internal server error",error:error.message})
|
|
16
|
+
}
|
|
17
|
+
}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import jwt from 'jsonwebtoken';
|
|
2
|
+
|
|
3
|
+
export const verifyToken=(req,res,next)=>{
|
|
4
|
+
const token = req.header.authorization;
|
|
5
|
+
if(!token){
|
|
6
|
+
return res.status(401).json({message:"No token"})
|
|
7
|
+
}
|
|
8
|
+
try {
|
|
9
|
+
jwt.verify(token,"secretkey");
|
|
10
|
+
next();
|
|
11
|
+
} catch (error) {
|
|
12
|
+
res.status(401).json({message:"Invalid token"})
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import mongoose from 'mongoose';
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
const productSchema=new mongoose.Schema({
|
|
5
|
+
ProductCode:{type:String,required:true,unique:true},
|
|
6
|
+
ProductName:{type:String,required:true},
|
|
7
|
+
Category:{type:String,required:true},
|
|
8
|
+
QuantityInStock:{type:Number,required:true},
|
|
9
|
+
UnitPrice:{type:String,required:true},
|
|
10
|
+
SupplierName:{type:String,required:true},
|
|
11
|
+
DateRecorded:{type:Date,default:Date.now}
|
|
12
|
+
})
|
|
13
|
+
export default mongoose.model("products",productSchema);
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import mongoose from 'mongoose';
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
|
|
5
|
+
const stocktransactionSchema=new mongoose.Schema({
|
|
6
|
+
TransactionId:{type:Number,required:true,unique:true},
|
|
7
|
+
TransactionDate:{type:Date,default:Date.now},
|
|
8
|
+
QuantityMoved:{type:Number,required:true},
|
|
9
|
+
TransactionType:{type:String,required:true},
|
|
10
|
+
UserId:{type:String,required:true,ref:'user'},
|
|
11
|
+
WarehouseCode:{type:String,required:true,ref:'warehouse'},
|
|
12
|
+
ProductCode:{type:String,required:true,ref:'products'},
|
|
13
|
+
|
|
14
|
+
|
|
15
|
+
|
|
16
|
+
})
|
|
17
|
+
export default mongoose.model("stocktransaction",stocktransactionSchema);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import mongoose from "mongoose";
|
|
2
|
+
|
|
3
|
+
const userSchema=new mongoose.Schema({
|
|
4
|
+
UserId:{type:String,required:true,unique:true},
|
|
5
|
+
username:{type:String,required:true},
|
|
6
|
+
email:{type:String,unique:true,required:true},
|
|
7
|
+
password:{type:String,required:true}
|
|
8
|
+
})
|
|
9
|
+
|
|
10
|
+
export default mongoose.model("user",userSchema);
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import mongoose from 'mongoose';
|
|
2
|
+
|
|
3
|
+
|
|
4
|
+
const warehouseSchema=new mongoose.Schema({
|
|
5
|
+
WarehouseCode:{type:String,required:true,unique:true},
|
|
6
|
+
WarehouseName:{type:String,required:true},
|
|
7
|
+
WarehouseLocation:{type:String,required:true}
|
|
8
|
+
|
|
9
|
+
})
|
|
10
|
+
export default mongoose.model("warehouse",warehouseSchema);
|