Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
The table of contents is too big for display.
Diff view
Diff view
  •  
  •  
  •  
2 changes: 2 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,2 +1,4 @@
# Clinic-Management-System
# Clinic-Management-System
# temp-cms
# temp-cms
220 changes: 148 additions & 72 deletions backend/app.js
Original file line number Diff line number Diff line change
@@ -1,78 +1,154 @@
require('dotenv').config();
const express = require('express');
const { supabase } = require("./utils/dbUtils.js");
const errorController = require('./controllers/errorController.js')
const {loginRouter} = require('./routes/loginRouter.js')
const cors = require('cors');

app = express();
const app = express();

app.use("/", (req,res,next)=>{
console.log("URL : ", req.url, " method : ", req.method);
app.use(cors());
app.use(express.json());
app.use(express.urlencoded({ extended: true }));

// Logging Middleware
app.use((req, res, next) => {
console.log(`[${new Date().toISOString()}] ${req.method} ${req.url}`);
next();
})
app.use(cors());
app.use(express.urlencoded());

app.get("/", (req,res,next)=>{
console.log("in this")
res.setHeader("Content-Type", "text/html")
res.write("<html>")
res.write("<head><title>meow</title></head>")
res.write("<h1>my heading</h1>")
res.write("<p>my paragraph lorem ipsum</p>")
res.write("</html>")
res.end()

})

//insert the code here

//upar
app.use("/auth",loginRouter);
app.use(errorController.errorHandler);

const PORT = 3000;
app.listen(PORT, ()=>{
console.log(`server running at http://localhost:${PORT}`)
})


// middleware code

// const jwt = require("jsonwebtoken");

// const protect = (allowedRoles = []) => {
// return (req, res, next) => {
// try {
// const authHeader = req.headers.authorization;

// if (!authHeader || !authHeader.startsWith("Bearer ")) {
// return res.status(401).json({
// success: false,
// message: "No token provided",
// });
// }

// const token = authHeader.split(" ")[1];
// const decoded = jwt.verify(token, process.env.JWT_SECRET);

// if (allowedRoles.length > 0 && !allowedRoles.includes(decoded.role)) {
// return res.status(403).json({
// success: false,
// message: "Access denied",
// });
// }

// req.user = decoded;
// next();
// } catch (error) {
// return res.status(401).json({
// success: false,
// message: "Invalid or expired token",
// });
// }
// };
// };

// module.exports = protect;
});

// ========================================================
// API ROUTES
// ========================================================

// 1. Authentication
app.post('/api/auth/login', async (req, res) => {
const { email, password } = req.body;
// TODO: Implement login logic using features.sql User Login query
// SELECT u.user_id, u.email, u.password_hash, r.role_name, u.first_name, u.last_name ...
res.json({ message: 'Login endpoint' });
});

app.post('/api/auth/register', async (req, res) => {
const { firstName, lastName, email, phone, password, role } = req.body;
// TODO: Implement register logic using features.sql Register User query
// INSERT INTO Users (role_id, email, password_hash, first_name, last_name, phone) VALUES ...
// And also create the corresponding profile (Patient, Staff) based on role
res.json({ message: 'Register endpoint' });
});

const { supabase } = require('./utils/dbUtils.js');

// 2. Doctor Module
app.get('/api/doctor/profile', async (req, res) => {
try {
const { data: staffData, error } = await supabase
.from('staff')
.select(`
department,
users ( first_name, last_name, email )
`)
.limit(1)
.single();

if (error || !staffData) {
return res.json({ success: true, profile: { name: 'DB Empty (Run features.sql)', department: 'No Data' } });
}

res.json({
success: true,
profile: {
name: `Dr. ${staffData.users.first_name} ${staffData.users.last_name}`,
department: staffData.department
}
});
} catch (e) {
res.json({ success: true, profile: { name: 'DB Error', department: 'Error' } });
}
});

app.get('/api/doctor/patients', async (req, res) => {
try {
const { data, error } = await supabase
.from('patients')
.select(`
patient_id,
date_of_birth,
users ( first_name, last_name )
`)
.limit(10);

if (error || !data) return res.json({ success: true, patients: [] });

const patients = data.map(p => ({
id: `PT-${p.patient_id}`,
name: p.users ? `${p.users.first_name} ${p.users.last_name}` : 'Unknown',
dob: p.date_of_birth
}));
res.json({ success: true, patients });
} catch(e) {
res.json({ success: true, patients: [] });
}
});

app.get('/api/doctor/appointments', async (req, res) => {
// TODO: Implement View assigned appointments query
res.json({ message: 'Doctor appointments endpoint' });
});

app.post('/api/doctor/prescription', async (req, res) => {
// TODO: Implement Create Prescription & Add Prescription Items query
res.json({ message: 'Create prescription endpoint' });
});

// 3. Patient Module
app.post('/api/patient/appointments/book', async (req, res) => {
// TODO: Implement Book appointment query
res.json({ message: 'Book appointment endpoint' });
});

app.get('/api/patient/medical-records', async (req, res) => {
// TODO: Implement View Patient Medical History query
res.json({ message: 'Patient medical records endpoint' });
});

// 4. Pharmacist Module
app.get('/api/pharmacist/prescriptions/pending', async (req, res) => {
// TODO: Implement View prescriptions pending dispensing query
res.json({ message: 'Pending prescriptions endpoint' });
});

app.post('/api/pharmacist/dispense', async (req, res) => {
// TODO: Implement Verify and Dispense Medicine query (Update Stock)
res.json({ message: 'Dispense medicine endpoint' });
});

// 5. Inventory Management
app.get('/api/inventory', async (req, res) => {
// TODO: Implement View inventory query
res.json({ message: 'Inventory endpoint' });
});

app.post('/api/inventory/add', async (req, res) => {
// TODO: Implement Add new medicine query
res.json({ message: 'Add inventory endpoint' });
});

// 6. Billing and Payment Management
app.post('/api/billing/invoice', async (req, res) => {
// TODO: Implement Generate Invoice query
res.json({ message: 'Generate invoice endpoint' });
});

app.post('/api/billing/payment', async (req, res) => {
// TODO: Implement Record payment query
res.json({ message: 'Record payment endpoint' });
});

// Global Error Handler
app.use((err, req, res, next) => {
console.error(err.stack);
res.status(500).json({ success: false, message: 'Internal Server Error' });
});

const PORT = process.env.PORT || 3000;
app.listen(PORT, () => {
console.log(`Server running at http://localhost:${PORT}`);
});
1 change: 0 additions & 1 deletion backend/node_modules/.bin/nodemon

This file was deleted.

1 change: 0 additions & 1 deletion backend/node_modules/.bin/nodetouch

This file was deleted.

1 change: 0 additions & 1 deletion backend/node_modules/.bin/semver

This file was deleted.

Loading