Implementar modulo de Roles y Usuarios

This commit is contained in:
2026-06-02 23:19:34 +00:00
parent 8b306b9afc
commit c6f3f3d135
17 changed files with 405 additions and 2 deletions

13
backend/.env Normal file
View File

@ -0,0 +1,13 @@
PORT=5000
MONGO_URI=mongodb://localhost:27017/sistema_combustible
JWT_SECRET=super_secret_key
SQL_SERVER=ABIGAILV\SQLEXPRESS
SQL_DATABASE=empresa_pan
SQL_USER=sa
SQL_PASSWORD=123456

View File

@ -4,6 +4,7 @@
"description": "",
"main": "index.js",
"scripts": {
"dev": "ts-node-dev --respawn src/server.ts",
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],

View File

@ -0,0 +1,35 @@
import express from "express";
import cors from "cors";
import roleRoutes from "./modules/roles/role.routes";
import userRoutes from "./modules/user/user.routes";
const app = express();
app.use(cors());
app.use(express.json());
app.use("/api/roles", roleRoutes);
app.use("/api/users", userRoutes)
app.use(express.urlencoded({
extended:true
})
);
app.get(
"/api/health",
(
req,
res
) => {
res.status(200).json({
success:true,
message: "API funcionando correctamente"
});
}
);
export default app;

View File

@ -0,0 +1,18 @@
import mongoose from "mongoose";
export const connectMongo = async (): Promise <void> => {
try {
await mongoose.connect(process.env.MONGO_URI!);
console.log("MongoDB conectado");
} catch(error){
console.error("Error MongoDB", error);
process.exit(1);
}
};

View File

@ -0,0 +1,30 @@
/*import sql from "mssql";
const sqlConfig:sql.config = {
user: process.env.SQL_USER,
password: process.env.SQL_PASSWORD,
server:process.env.SQL_SERVER!,
database:process.env.SQL_DATABASE,
options:{
trustServerCertificate:true,
encrypt:false
}
};
export const connectSqlServer = async() => {
try{
await sql.connect(sqlConfig);
console.log("SQL Server Conectado");
}catch(error){
console.error("Error SQL Server", error);
}
};*/

View File

@ -0,0 +1,30 @@
import { Request, Response } from "express";
import { RoleService } from "./role.service";
const roleService = new RoleService();
export class RoleController {
async getAll(
req:Request,
res:Response
){
const roles =
await roleService.getAll();
res.json(roles);
}
async create(
req:Request,
res:Response
){
const role =
await roleService.create(
req.body
);
res.status(201).json(role);
}
}

View File

@ -0,0 +1,6 @@
export interface IRole {
roleName:string;
description:string;
active:boolean;
}

View File

@ -0,0 +1,26 @@
import mongoose, { Schema } from "mongoose";
const roleSchema = new mongoose.Schema({
roleName:{
type:String,
required:true,
unique:true
},
description:{
type:String
},
active:{
type:Boolean,
default:true
}
},
{
timestamps:true
}
);
export default mongoose.model("Role", roleSchema);

View File

@ -0,0 +1,13 @@
import { Router } from "express";
import { RoleController } from "./role.controller";
const roleRoutes = Router();
const controller = new RoleController();
roleRoutes.get("/", controller.getAll);
roleRoutes.post("/", controller.create);
export default roleRoutes ;

View File

@ -0,0 +1,12 @@
import roleModel from "./role.model";
export class RoleService {
async getAll() {
return await roleModel.find();
}
async create(data:any) {
return await roleModel.create(data);
}
}

View File

@ -0,0 +1,66 @@
import { Request, Response } from "express";
import { UserService } from "./user.service";
const userService = new UserService();
export class UserController {
async getAll(
req:Request,
res:Response
) {
const users =
await userService.getAll();
res.json(users);
}
async getById(
req:Request,
res:Response
){
const user =
await userService.getById(
req.params.id as string
);
res.json(user);
}
async create (
req:Request,
res:Response
) {
const user =
await userService.create(
req.body
);
res.status(201).json(user);
}
async update(
req:Request,
res:Response
){
const user =
await userService.update(
req.params.id as string,
req.body
);
res.json(user);
}
async detele (
req:Request,
res:Response
) {
await userService.delete(
req.params.id as string
);
res.json({message: "Usuario eliminado"});
}
}

View File

@ -0,0 +1,11 @@
import { ObjectId } from "mongoose";
export interface IUser {
employeeId:number;
userName:string;
passwordHash:string;
roleId:ObjectId;
active:boolean;
lastLogin:Date;
}

View File

@ -0,0 +1,46 @@
import mongoose from "mongoose";
const userSchema = new mongoose.Schema({
employeeId:{
type:Number,
required:true,
unique:true,
},
userName:{
type:String,
required:true,
unique:true,
},
passwordHash:{
type:String,
required:true
},
roleId:{
type:mongoose.Types.ObjectId,
ref:"Role",
required:true
},
active:{
type:Boolean,
default:true
},
lastLogin:{
type:Date
}
},
{
timestamps:true
}
);
export default mongoose.model("User", userSchema);

View File

@ -0,0 +1,19 @@
import { Router } from "express";
import { UserController } from "./user.controller";
const userRoutes = Router();
const controller = new UserController();
userRoutes.get("/", controller.getAll);
userRoutes.get("/:id", controller.getById);
userRoutes.post("/", controller.create);
userRoutes.put("/:id", controller.update);
userRoutes.delete("/:id", controller.detele);
export default userRoutes;

View File

@ -0,0 +1,46 @@
import userModel from "./user.model";
export class UserService {
async getAll() {
return await userModel
.find()
.populate("roleId");
}
async getById(
id:string
) {
return await userModel
.find()
.populate("roleId");
}
async create(
data:any
) {
return await userModel.create(data);
}
async update(
id:string,
data:any
) {
return await userModel.findByIdAndUpdate(
id,
data,
{
new:true
}
);
}
async delete(
id:string
) {
return await userModel.findByIdAndDelete(
id
);
}
}

View File

@ -0,0 +1,31 @@
import dotenv from "dotenv";
dotenv.config();
import { connectMongo } from "./config/mongodb";
//import { connectSqlServer } from "./config/sqlserver";
import app from "./app";
const PORT = process.env.PORT || 5000;
const startServer = async() => {
try {
await connectMongo();
//await connectSqlServer();
app.listen(PORT, () => {
console.log(`Servidor ejecutandose en puerto ${PORT}`);
});
}catch(error){
console.error("Error al iniciar el servidor", error);
}
};
startServer();

View File

@ -9,7 +9,7 @@
// See also https://aka.ms/tsconfig/module
"module": "nodenext",
"target": "esnext",
"types": [],
"types": ["node"],
// For nodejs:
// "lib": ["esnext"],
// "types": ["node"],
@ -35,7 +35,7 @@
// Recommended Options
"strict": true,
"jsx": "react-jsx",
"verbatimModuleSyntax": true,
//"verbatimModuleSyntax": true,
"isolatedModules": true,
"noUncheckedSideEffectImports": true,
"moduleDetection": "force",