Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Add admin metrics retrieval #170

Merged
merged 3 commits into from
Aug 23, 2021
Merged
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
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 37 additions & 1 deletion src/modules/company/controllers/company.controller.ts
Original file line number Diff line number Diff line change
@@ -1,20 +1,27 @@
import {
Controller,
Get,
HttpStatus,
NotFoundException,
Param,
Post,
Query,
Req,
Res,
UploadedFile,
UseFilters,
UseGuards,
UseInterceptors,
} from '@nestjs/common';
import { AuthGuard } from '@nestjs/passport';
import { FileInterceptor } from '@nestjs/platform-express';
import * as fs from 'fs';
import { diskStorage } from 'multer';
import { BaseController } from 'src/core/controllers/base.controller';
import { BaseController } from '../../../core/controllers/base.controller';
import { editFileName, imageFileFilter } from 'src/core/helpers/sanitize-image';
import { HttpErrorFilter } from 'src/core/interceptors/error.filter';
import { getConfiguration } from 'src/core/utilities/systemConfigs';
import { User } from '../../user/entities/user.entity';
import { Company } from '../entities/company.entity';
import { CompanyService } from '../services/company.service';

Expand Down Expand Up @@ -63,4 +70,33 @@ export class CompanyController extends BaseController<Company> {
throw new Error(e.message);
}
}
@Get(':id/metrics')
@UseFilters(new HttpErrorFilter())
@UseGuards(AuthGuard('jwt'))
async companynmetrics(
@Req() req: any,
@Res() res: any,
@Query() query: any,
@Param() param: any,
): Promise<any> {
const user: User = req.user;
const userCompany = user.companies.filter(
(company) => company.id === param.id,
);
if (userCompany.length > 0) {
const company = await this.service.findOneByUid(param.id);
if (company) {
const metrics = await this.service.companyMetrics({ company });
return res.status(HttpStatus.OK).send(metrics);
} else {
return res
.status(HttpStatus.NOT_FOUND)
.send(`Company with ID ${param.id} could not be found`);
}
} else {
return res
.status(HttpStatus.FORBIDDEN)
.send(`You do not have access to this resource`);
}
}
}
21 changes: 21 additions & 0 deletions src/modules/company/services/company.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -12,4 +12,25 @@ export class CompanyService extends BaseService<Company> {
) {
super(repository, Company);
}
async companyMetrics({ company }): Promise<any> {
let sql = `SELECT ID FROM JOB WHERE COMPANYID=${company.id}`;
const jobs = await this.repository.manager.query(sql);
let applicants = `SELECT COUNT(*) FROM APPLIEDJOB WHERE JOBID IN(${jobs
.map((job: { id: any }) => job.id)
.join(',')})`;
applicants = await this.repository.manager.query(applicants);
let interviews = `SELECT COUNT(*) FROM APPLIEDJOB WHERE JOBID IN(${jobs
.map((job: { id: any }) => job.id)
.join(',')}) AND INTERVIEW=TRUE AND ACCEPTED=TRUE`;
interviews = await this.repository.manager.query(interviews);
const metrics = {
message: `Metrics for ${company.name}`,
metrics: {
applicants: Number(applicants[0]['count']),
jobs: jobs.length,
interviews: Number(interviews[0]['count']),
},
};
return metrics;
}
}
9 changes: 5 additions & 4 deletions src/modules/user/controllers/auth.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,6 +3,7 @@ import {
Controller,
Get,
HttpStatus,
Param,
Post,
Query,
Req,
Expand Down Expand Up @@ -56,15 +57,15 @@ export class AuthController {
return res.status(HttpStatus.OK).send(resolveResponse(user));
}

@Get('companymetrics')
@Get('metrics')
@UseFilters(new HttpErrorFilter())
@UseGuards(AuthGuard('jwt'))
async companynmetrics(
async metrics(
@Req() req: any,
@Res() res: any,
@Query() query: any,
): Promise<any> {
const user = await this.authService.userInfo(req.user.id, query.fields);
return res.status(HttpStatus.OK).send(resolveResponse(user));
const metrics = await this.authService.getMertics();
return res.status(HttpStatus.OK).send(metrics);
}
}
4 changes: 2 additions & 2 deletions src/modules/user/entities/user.entity.ts
Original file line number Diff line number Diff line change
Expand Up @@ -197,12 +197,12 @@ export class User extends NamedEntity {
if (isEmail) {
user = await User.findOne({
where: { email: username },
relations: ['userRoles'],
relations: ['userRoles', 'companies'],
});
} else {
user = await User.findOne({
where: { username },
relations: ['userRoles'],
relations: ['userRoles', 'companies'],
});
}
if (
Expand Down
19 changes: 19 additions & 0 deletions src/modules/user/services/auth.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ import {
getRelations,
getSelections,
} from '../../../core/helpers/get-fields.utility';
import { Company } from 'src/modules/company/entities/company.entity';

@Injectable()
export class AuthService {
Expand All @@ -23,6 +24,8 @@ export class AuthService {

@InjectRepository(Job)
public jobrepository: Repository<Job>,
@InjectRepository(Company)
public companyrepository: Repository<Company>,
) {}
async login(username: any, password: any): Promise<any> {
const user: User = await User.verifyUser(username, password);
Expand Down Expand Up @@ -77,4 +80,20 @@ export class AuthService {
relations: getRelations(fields, metaData),
});
}
async getMertics(): Promise<any> {
const users = await this.userrepository.count();
const companies = await this.companyrepository.count();
const applications = Number(
(
await this.jobrepository.manager.query(
'SELECT COUNT(*) FROM APPLIEDJOB',
)
)[0]['count'],
);
const jobs = await this.jobrepository.count();
return {
message: 'Job Portal Admin Metrics',
metrics: { users, companies, applications, jobs },
};
}
}
4 changes: 2 additions & 2 deletions src/modules/user/services/jwt.strategy.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -22,13 +22,13 @@ export class JwtPassportStrategy extends PassportStrategy(Strategy) {
if (payload.email) {
user = await this.userRepository.findOne({
where: { email: payload.email },
relations: ['userRoles'],
relations: ['userRoles', 'companies'],
});
}
if (payload.username) {
user = await this.userRepository.findOne({
where: { username: payload.username },
relations: ['userRoles'],
relations: ['userRoles', 'companies'],
});
}
if (!user) {
Expand Down