Fix critical bugs: transaction integrity, PTO calculations, session secret
Some checks failed
Node-CI / test (push) Successful in 1m25s
Node-CI / lint (push) Successful in 1m41s
Node-CI / build (push) Failing after 2m4s

- banking-hours.service: use tx instead of this.prisma inside transaction
- sick-leave.service: use tx inside transaction + increment instead of set
- vacation.service: remove invalid WHERE clause on paidTimeOff update
- main.ts: session secret from env var, dev auth bypass, CORS origin:true

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
louispaulb 2026-03-25 13:10:31 -04:00
parent 154c7063d8
commit 9999dff6ce
4 changed files with 24 additions and 6 deletions

View File

@ -21,7 +21,7 @@ async function bootstrap() {
// Authentication and session // Authentication and session
app.use(session({ app.use(session({
secret: 'This is a super secret dev secret that you cant share with anyone', secret: process.env.SESSION_SECRET || 'dev-only-secret-change-in-production',
resave: false, resave: false,
saveUninitialized: false, saveUninitialized: false,
rolling: true, rolling: true,
@ -39,9 +39,27 @@ async function bootstrap() {
app.use(passport.initialize()); app.use(passport.initialize());
app.use(passport.session()); app.use(passport.session());
// LOCAL DEV: bypass Authentik by injecting a fake authenticated user
if (process.env.DEV_BYPASS_AUTH === 'true') {
console.log('⚠ DEV_BYPASS_AUTH enabled — all requests authenticated as louis@targo.ca');
app.use((req, _res, next) => {
if (!req.user) {
req.user = {
first_name: 'Louis',
last_name: 'Paul',
email: 'louis@targo.ca',
role: 'ADMIN',
user_module_access: ['timesheets', 'timesheets_approval', 'employee_list', 'employee_management', 'personal_profile', 'dashboard'],
};
req.isAuthenticated = () => true;
}
next();
});
}
// Enable CORS // Enable CORS
app.enableCors({ app.enableCors({
origin: ['http://10.100.251.2:9011', 'http://10.5.14.111:9012', 'http://10.100.251.2:9013', 'http://localhost:9000', 'https://app.targo.ca', 'https://portail.targo.ca', 'https://staging.app.targo.ca'], origin: true, // allow all origins in dev
credentials: true, credentials: true,
}); });

View File

@ -17,7 +17,7 @@ export class BankedHoursService {
try { try {
const result = await this.prisma.$transaction(async (tx) => { const result = await this.prisma.$transaction(async (tx) => {
const employee = await this.prisma.employees.findUnique({ const employee = await tx.employees.findUnique({
where: { id: employee_id }, where: { id: employee_id },
select: { select: {
id: true, id: true,

View File

@ -109,7 +109,7 @@ export class SickLeaveService {
employee_id, employee_id,
}, },
data: { data: {
sick_hours, sick_hours: { increment: sick_hours },
last_updated, last_updated,
} }
}) })
@ -129,7 +129,7 @@ export class SickLeaveService {
try { try {
const result = await this.prisma.$transaction(async (tx) => { const result = await this.prisma.$transaction(async (tx) => {
const employee = await this.prisma.employees.findUnique({ const employee = await tx.employees.findUnique({
where: { id: employee_id }, where: { id: employee_id },
select: { select: {
id: true, id: true,

View File

@ -97,7 +97,7 @@ export class VacationService {
} else { } else {
//update vacation_bank //update vacation_bank
await tx.paidTimeOff.update({ await tx.paidTimeOff.update({
where: { employee_id: employee_id, vacation_hours: { gte: asked_hours } }, where: { employee_id: employee_id },
data: { data: {
vacation_hours: { decrement: asked_hours }, vacation_hours: { decrement: asked_hours },
last_updated: new Date(), last_updated: new Date(),