three issues fixed just backing up
This commit is contained in:
parent
d7f44057cc
commit
2b2a1bc6ce
@ -4,7 +4,8 @@ import { SSOConfig, SSOUserData } from '../types/auth.types';
|
|||||||
// This ensures values are read after secrets are loaded from Google Secret Manager
|
// This ensures values are read after secrets are loaded from Google Secret Manager
|
||||||
const ssoConfig: SSOConfig = {
|
const ssoConfig: SSOConfig = {
|
||||||
get jwtSecret() { return process.env.JWT_SECRET || ''; },
|
get jwtSecret() { return process.env.JWT_SECRET || ''; },
|
||||||
get jwtExpiry() { return process.env.JWT_EXPIRY || '24h'; },
|
// VAPT: reduce access token lifetime to 30 minutes by default
|
||||||
|
get jwtExpiry() { return process.env.JWT_EXPIRY || '30m'; },
|
||||||
get refreshTokenExpiry() { return process.env.REFRESH_TOKEN_EXPIRY || '7d'; },
|
get refreshTokenExpiry() { return process.env.REFRESH_TOKEN_EXPIRY || '7d'; },
|
||||||
get sessionSecret() { return process.env.SESSION_SECRET || ''; },
|
get sessionSecret() { return process.env.SESSION_SECRET || ''; },
|
||||||
// Use only FRONTEND_URL from environment - no fallbacks
|
// Use only FRONTEND_URL from environment - no fallbacks
|
||||||
|
|||||||
@ -23,6 +23,26 @@ import { Dealer } from '@models/Dealer';
|
|||||||
*/
|
*/
|
||||||
|
|
||||||
export class Form16Controller {
|
export class Form16Controller {
|
||||||
|
// Minimal PII masking for 26AS APIs – mask PAN in all responses
|
||||||
|
private maskPan(pan: unknown): string | undefined {
|
||||||
|
if (pan == null) return undefined;
|
||||||
|
const s = String(pan).trim();
|
||||||
|
if (!s) return undefined;
|
||||||
|
const last4 = s.slice(-4);
|
||||||
|
if (s.length <= 4) return 'XXXX';
|
||||||
|
return `XXXXXXX${last4}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
private mask26asEntry(entry: any): any {
|
||||||
|
if (!entry) return entry;
|
||||||
|
const plain = typeof entry.toJSON === 'function' ? entry.toJSON() : entry;
|
||||||
|
const masked = { ...plain };
|
||||||
|
if (masked.panNumber) {
|
||||||
|
masked.panNumber = this.maskPan(masked.panNumber);
|
||||||
|
}
|
||||||
|
return masked;
|
||||||
|
}
|
||||||
|
|
||||||
private toSapCsv(sap: {
|
private toSapCsv(sap: {
|
||||||
trnsUniqNo?: string | null;
|
trnsUniqNo?: string | null;
|
||||||
tdsTransId?: string | null;
|
tdsTransId?: string | null;
|
||||||
@ -257,11 +277,8 @@ export class Form16Controller {
|
|||||||
limit,
|
limit,
|
||||||
offset,
|
offset,
|
||||||
});
|
});
|
||||||
return ResponseHandler.success(
|
const entries = (result.rows || []).map((row: any) => this.mask26asEntry(row));
|
||||||
res,
|
return ResponseHandler.success(res, { entries, total: result.total, summary: result.summary }, '26AS entries fetched');
|
||||||
{ entries: result.rows, total: result.total, summary: result.summary },
|
|
||||||
'26AS entries fetched'
|
|
||||||
);
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
||||||
logger.error('[Form16Controller] list26as error:', error);
|
logger.error('[Form16Controller] list26as error:', error);
|
||||||
@ -300,7 +317,8 @@ export class Form16Controller {
|
|||||||
statusOltas: (body.statusOltas as string) || undefined,
|
statusOltas: (body.statusOltas as string) || undefined,
|
||||||
remarks: (body.remarks as string) || undefined,
|
remarks: (body.remarks as string) || undefined,
|
||||||
});
|
});
|
||||||
return ResponseHandler.success(res, { entry }, '26AS entry created');
|
const masked = this.mask26asEntry(entry);
|
||||||
|
return ResponseHandler.success(res, { entry: masked }, '26AS entry created');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
||||||
logger.error('[Form16Controller] create26as error:', error);
|
logger.error('[Form16Controller] create26as error:', error);
|
||||||
@ -339,7 +357,8 @@ export class Form16Controller {
|
|||||||
if (!entry) {
|
if (!entry) {
|
||||||
return ResponseHandler.error(res, '26AS entry not found', 404);
|
return ResponseHandler.error(res, '26AS entry not found', 404);
|
||||||
}
|
}
|
||||||
return ResponseHandler.success(res, { entry }, '26AS entry updated');
|
const masked = this.mask26asEntry(entry);
|
||||||
|
return ResponseHandler.success(res, { entry: masked }, '26AS entry updated');
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
const errorMessage = error instanceof Error ? error.message : 'Unknown error';
|
||||||
logger.error('[Form16Controller] update26as error:', error);
|
logger.error('[Form16Controller] update26as error:', error);
|
||||||
|
|||||||
@ -45,10 +45,10 @@ const upload = multer({
|
|||||||
limits: { fileSize: 15 * 1024 * 1024 },
|
limits: { fileSize: 15 * 1024 * 1024 },
|
||||||
});
|
});
|
||||||
|
|
||||||
// 26AS upload: .txt only, 5MB, memory storage (parse then bulk insert)
|
// 26AS upload: .txt only, 40MB, memory storage (parse then bulk insert)
|
||||||
const upload26asTxt = multer({
|
const upload26asTxt = multer({
|
||||||
storage: multer.memoryStorage(),
|
storage: multer.memoryStorage(),
|
||||||
limits: { fileSize: 5 * 1024 * 1024 },
|
limits: { fileSize: 40 * 1024 * 1024 },
|
||||||
fileFilter: (_req, file, cb) => {
|
fileFilter: (_req, file, cb) => {
|
||||||
const ext = path.extname(file.originalname || '').toLowerCase();
|
const ext = path.extname(file.originalname || '').toLowerCase();
|
||||||
const isTxt = ext === '.txt' || (file.mimetype && (file.mimetype === 'text/plain' || file.mimetype === 'application/octet-stream'));
|
const isTxt = ext === '.txt' || (file.mimetype && (file.mimetype === 'text/plain' || file.mimetype === 'application/octet-stream'));
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user