Skip to content
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
107 changes: 84 additions & 23 deletions src/controllers/facility.controller.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,7 @@ declare global {
decodeuser?: any;
}
}
};
}

import {
createFacility,
Expand All @@ -17,11 +17,17 @@ import {
getAllFacility_ByFiltering,
getFacilitiesByOperator,
updateFacilityCapacity,
searchFacilities,
} from "../services/db/facility.service";
import { StatusCodes } from "http-status-codes";
import { BadRequestError, NotFoundError, UnauthorizedError } from "../errors/errors";
import {
BadRequestError,
NotFoundError,
UnauthorizedError,
} from "../errors/errors";
import { PrismaClient } from "@prisma/client";
import { deleteImageFromCloudinary } from "../services/cloudinary.service";
import { FacilityFilterOptions } from "../types/types";
const prisma = new PrismaClient();

export const addFacility = async (
Expand All @@ -30,7 +36,10 @@ export const addFacility = async (
next: NextFunction
) => {
try {
const facility = await createFacility({...req.body, operatorId: req.currentUser.operatorId});
const facility = await createFacility({
...req.body,
operatorId: req.currentUser.operatorId,
});

res.status(StatusCodes.CREATED).json({
message: "Facility created successfully",
Expand All @@ -41,7 +50,6 @@ export const addFacility = async (
}
};


export const deleteFacilityImage = async (
req: Request,
res: Response,
Expand All @@ -57,9 +65,9 @@ export const deleteFacilityImage = async (
});
if (!facility) {
throw new NotFoundError({
message: 'Error deleting facility image',
from: 'deleteFacilityImage()',
cause: 'Facility not found'
message: "Error deleting facility image",
from: "deleteFacilityImage()",
cause: "Facility not found",
});
}

Expand All @@ -76,27 +84,33 @@ export const deleteFacilityImage = async (
message: "Image deleted successfully",
});
return;

} catch (error) {
next(error);
}
};

export const getFacility = async (req: Request, res: Response, next: NextFunction) => {
export const getFacility = async (
req: Request,
res: Response,
next: NextFunction
) => {
try {
const facilityId = BigInt(req.params.facilityId);
const facility = await getFacilityById(facilityId );
res.status(StatusCodes.OK).json({
message: "Facility fetch successful",
facility: facility
const facility = await getFacilityById(facilityId);
res.status(StatusCodes.OK).json({
message: "Facility fetch successful",
facility: facility,
});

} catch(error) {
} catch (error) {
next(error);
}
};

export const updateFacility = async (req: Request, res: Response, next: NextFunction) => {
export const updateFacility = async (
req: Request,
res: Response,
next: NextFunction
) => {
try {
const facility = req.facility; // already validated by isFacilityOwner
const updateData = req.body;
Expand All @@ -112,7 +126,6 @@ export const updateFacility = async (req: Request, res: Response, next: NextFunc
}
};


export const deleteFacility = async (
req: Request,
res: Response,
Expand Down Expand Up @@ -169,7 +182,7 @@ export const getAllFacilityByFiltering = async (
message: `Invalid type '${filters.type}'. Must be one of ${validTypes.join(", ")}`,
from: "getAllFacility",
});
};
}

const { role, operatorId } = req.currentUser; // if user is a farmer or operator, to enable the filtering.
const result = await getAllFacility_ByFiltering(filters, role, operatorId);
Expand All @@ -178,20 +191,17 @@ export const getAllFacilityByFiltering = async (
message: "Facilities fetched successfully",
...result,
});

} catch (error) {
next(error);
}
};


export const getFacilitiesByOperatorController = async (
req: Request,
res: Response,
next: NextFunction
) => {
try {

const operatorId = BigInt(req.operator?.id); // Get from isAuthorisedMiddleware
if (!operatorId) {
throw new UnauthorizedError({
Expand All @@ -210,7 +220,7 @@ export const getFacilitiesByOperatorController = async (
});

if (result.facilities.length === 0) {
res.status(StatusCodes.OK).json({
res.status(StatusCodes.OK).json({
message: "You don't own any facilities yet",
facilities: [],
pagination: result.pagination,
Expand All @@ -237,7 +247,7 @@ export const updateCapacity = async (
const parsedCapacity = parseInt(capacity, 10);

if (!parsedCapacity || isNaN(parsedCapacity) || parsedCapacity < 0) {
throw new BadRequestError({
throw new BadRequestError({
message: "Capacity musst be a positive number",
from: "updateCapacity",
});
Expand All @@ -256,3 +266,54 @@ export const updateCapacity = async (
next(error);
}
};

export const globalFacilitySearch = async (
req: Request,
res: Response,
next: NextFunction
) => {
try {
const {
location,
type,
available,
operatorName,
minPrice,
maxPrice,
page = "1",
limit = "10",
} = req.query;

const allowedTypes = [
"DRYER",
"STORAGE",
"PROCESSING",
"COLDROOM",
"OTHER",
] as const;
type FacilityType = (typeof allowedTypes)[number];

const filters: FacilityFilterOptions = {
location: location as string,
type: allowedTypes.includes(type as FacilityType)
? (type as FacilityType)
: undefined,
available:
available === "true" ? true : available === "false" ? false : undefined,
operatorName: operatorName as string,
minPrice: minPrice ? Number(minPrice) : undefined,
maxPrice: maxPrice ? Number(maxPrice) : undefined,
page: Number(page),
limit: Number(limit),
};

const response = await searchFacilities(filters);

res.status(200).json({
message: "Facilities fetched successfully",
data: response,
});
} catch (error) {
next(error);
}
};
3 changes: 2 additions & 1 deletion src/routes/facility.routes.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@ import express from 'express';
import { facilityValidator } from '../utils/validateFacility';
import { verifyAuth } from '../middlewares/authenticate.middleware';
import { isAuthorizedOperator, isOperator, isFacilityOwner } from '../middlewares/authorization.middlewares';
import { addFacility, getFacility, updateFacility, getAllFacilityByFiltering, deleteFacility, updateCapacity , deleteFacilityImage, getFacilitiesByOperatorController } from '../controllers/facility.controller';
import { addFacility, getFacility, updateFacility, getAllFacilityByFiltering, deleteFacility, updateCapacity , deleteFacilityImage, getFacilitiesByOperatorController, globalFacilitySearch } from '../controllers/facility.controller';
import { upload } from '../config/config.cloudinary';
import { uploadFacilityImage } from '../controllers/cloudinary.controller';

Expand All @@ -11,6 +11,7 @@ const router = express.Router();
//Ideally facilityId should be id
router.post('/', verifyAuth, facilityValidator, addFacility);
router.get('/', verifyAuth, getAllFacilityByFiltering); //Allows filtering and no filtering
router.get('/search', verifyAuth, globalFacilitySearch)
router.get('/all', verifyAuth, isAuthorizedOperator, getFacilitiesByOperatorController);
router.post('/images', verifyAuth, isOperator, upload.array('images', 5), uploadFacilityImage);

Expand Down
Loading