Feat: Dashboard accuracy, Staff & Settings modules, and File Auth fix

This commit is contained in:
Hamza-Ayed
2026-04-19 15:25:43 +03:00
parent 3acd9f261b
commit ef9baf33f7
7 changed files with 415 additions and 12 deletions

View File

@@ -18,7 +18,12 @@ export class JwtStrategy extends PassportStrategy(Strategy) {
private dataSource: DataSource,
) {
super({
jwtFromRequest: ExtractJwt.fromAuthHeaderAsBearerToken(),
jwtFromRequest: ExtractJwt.fromExtractors([
ExtractJwt.fromAuthHeaderAsBearerToken(),
(req) => {
return req.query ? (req.query as any).token : null;
},
]),
ignoreExpiration: false,
secretOrKey: configService.getOrThrow<string>('JWT_SECRET'),
});

View File

@@ -25,9 +25,23 @@ export class DashboardService {
const pendingInvoices = await this.invoiceRepository.count({
where: {
tenant_id: tenantId,
status: InvoiceStatus.EXTRACTING // or any non-final state
status: Buffer.from('approved').toString() === InvoiceStatus.APPROVED ? InvoiceStatus.UPLOADED : InvoiceStatus.UPLOADED // wait, using In operator is better
},
});
// Using QueryBuilder for better control
const statuses = await this.invoiceRepository
.createQueryBuilder('invoice')
.select('status')
.addSelect('COUNT(*)', 'count')
.where('invoice.tenant_id = :tenantId', { tenantId })
.groupBy('status')
.getRawMany();
const statusMap = statuses.reduce((acc, curr) => {
acc[curr.status] = parseInt(curr.count);
return acc;
}, {});
const companiesCount = await this.companyRepository.count({
where: { tenant_id: tenantId },
@@ -49,11 +63,14 @@ export class DashboardService {
relations: ['company'],
});
const approvedInvoicesCount = statusMap[InvoiceStatus.APPROVED] || 0;
const processingInvoices = totalInvoices - approvedInvoicesCount;
return {
stats: {
totalInvoices,
approvedInvoices,
pendingInvoices,
approvedInvoices: approvedInvoicesCount,
pendingInvoices: processingInvoices,
companiesCount,
totalTax,
},