Skip to content

Commit

Permalink
Merge pull request #7 from Prakharnagore/tenant-filter
Browse files Browse the repository at this point in the history
Tenant filter
  • Loading branch information
Prakharnagore committed Aug 24, 2024
2 parents 4ff659d + 96cd077 commit f7833be
Show file tree
Hide file tree
Showing 5 changed files with 71 additions and 8 deletions.
16 changes: 12 additions & 4 deletions src/controllers/TenantController.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { NextFunction, Request, Response } from "express";
import { TenantService } from "../services/TenantService";
import { CreateTenantRequest } from "../types";
import { CreateTenantRequest, TenantQueryParams } from "../types";
import { Logger } from "winston";
import { validationResult } from "express-validator";
import { matchedData, validationResult } from "express-validator";
import createHttpError from "http-errors";

export class TenantController {
Expand Down Expand Up @@ -60,11 +60,19 @@ export class TenantController {
}

async getAll(req: Request, res: Response, next: NextFunction) {
const validatedQuery = matchedData(req, { onlyValidData: true });
try {
const tenants = await this.tenantService.getAll();
const [tenants, count] = await this.tenantService.getAll(
validatedQuery as TenantQueryParams,
);

this.logger.info("All tenant have been fetched");
res.json(tenants);
res.json({
currentPage: validatedQuery.currentPage as number,
perPage: validatedQuery.perPage as number,
total: count,
data: tenants,
});
} catch (err) {
next(err);
}
Expand Down
5 changes: 4 additions & 1 deletion src/routes/tenant.ts
Original file line number Diff line number Diff line change
Expand Up @@ -14,6 +14,7 @@ import { canAccess } from "../middlewares/canAccess";
import { Roles } from "../constants";
import { CreateTenantRequest } from "../types";
import tenantValidator from "../validators/tenantValidator";
import listTenantsValidator from "../validators/list-tenants-validator";

const router = express.Router();
const tenantRepository = AppDataSource.getRepository(Tenant);
Expand All @@ -39,7 +40,8 @@ router.patch(

router.get(
"/",
(req, res, next) =>
listTenantsValidator,
(req: Request, res: Response, next: NextFunction) =>
tenantController.getAll(req, res, next) as unknown as RequestHandler,
);

Expand All @@ -50,6 +52,7 @@ router.get(
(req, res, next) =>
tenantController.getOne(req, res, next) as unknown as RequestHandler,
);

router.delete(
"/:id",
authenticate as RequestHandler,
Expand Down
21 changes: 18 additions & 3 deletions src/services/TenantService.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { Repository } from "typeorm";
import { ITenant } from "../types";
import { ITenant, TenantQueryParams } from "../types";
import { Tenant } from "../entity/Tenant";

export class TenantService {
Expand All @@ -13,8 +13,23 @@ export class TenantService {
return await this.tenantRepository.update(id, tenantData);
}

async getAll() {
return await this.tenantRepository.find();
async getAll(validatedQuery: TenantQueryParams) {
const queryBuilder = this.tenantRepository.createQueryBuilder("tenant");

if (validatedQuery.q) {
const searchTerm = `%${validatedQuery.q}%`;
queryBuilder.where(
"CONCAT(tenant.name, ' ', tenant.address) ILike :q",
{ q: searchTerm },
);
}

const result = await queryBuilder
.skip((validatedQuery.currentPage - 1) * validatedQuery.perPage)
.take(validatedQuery.perPage)
.orderBy("tenant.id", "DESC")
.getManyAndCount();
return result;
}

async getById(tenantId: number) {
Expand Down
6 changes: 6 additions & 0 deletions src/types/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -59,3 +59,9 @@ export interface UserQueryParams {
q: string;
role: string;
}

export interface TenantQueryParams {
q: string;
perPage: number;
currentPage: number;
}
31 changes: 31 additions & 0 deletions src/validators/list-tenants-validator.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,31 @@
import { checkSchema } from "express-validator";

export default checkSchema(
{
q: {
trim: true,
customSanitizer: {
options: (value: unknown) => {
return value ? value : "";
},
},
},
currentPage: {
customSanitizer: {
options: (value) => {
const parsedValue = Number(value);
return Number.isNaN(parsedValue) ? 1 : parsedValue;
},
},
},
perPage: {
customSanitizer: {
options: (value) => {
const parsedValue = Number(value);
return Number.isNaN(parsedValue) ? 6 : parsedValue;
},
},
},
},
["query"],
);

0 comments on commit f7833be

Please sign in to comment.