@deepintel-ltd/farmpro-contracts
v1.7.14
Published
Type-safe API contracts for FarmPro API
Downloads
2,160
Maintainers
Readme
FarmPro API Contracts
Type-safe API contracts for FarmPro API using ts-rest and Zod.
Overview
This package provides comprehensive, type-safe API contracts for all FarmPro modules. The contracts follow RESTful principles and use Zod schemas for runtime validation.
Installation
npm install @farmpro/contractsStructure
The contracts are organized into modules:
src/
├── index.ts # Main exports
├── routes/ # API route definitions
│ ├── index.ts # Main contract combining all routers
│ ├── farms.routes.ts
│ ├── fields.routes.ts
│ ├── tasks.routes.ts
│ ├── inventory.routes.ts
│ ├── finance.routes.ts
│ ├── harvest.routes.ts
│ ├── soil-tests.routes.ts
│ ├── weather.routes.ts
│ ├── team.routes.ts
│ ├── equipment.routes.ts
│ ├── documents.routes.ts
│ ├── suppliers.routes.ts
│ └── analytics.routes.ts
└── schemas/ # Zod schemas
├── common.schemas.ts # Shared schemas (pagination, errors, GeoJSON)
├── farms.schemas.ts
├── fields.schemas.ts
├── tasks.schemas.ts
├── inventory.schemas.ts
├── finance.schemas.ts
├── harvest.schemas.ts
├── soil-tests.schemas.ts
├── weather.schemas.ts
├── team.schemas.ts
├── equipment.schemas.ts
├── documents.schemas.ts
├── suppliers.schemas.ts
└── analytics.schemas.tsUsage
Backend (NestJS)
import { apiContract } from '@farmpro/contracts';
import { TsRestHandler, tsRestHandler } from '@ts-rest/nest';
@Controller()
export class FarmsController {
@TsRestHandler(apiContract.farms)
async handler() {
return tsRestHandler(apiContract.farms, {
listFarms: async ({ query }) => {
// Implementation
},
createFarm: async ({ body }) => {
// Implementation
},
// ... other handlers
});
}
}Frontend
import { initClient } from '@ts-rest/core';
import { apiContract } from '@farmpro/contracts';
const client = initClient(apiContract, {
baseUrl: 'http://localhost:3000/api',
baseHeaders: {
'Content-Type': 'application/json',
},
});
// Use the client
const farms = await client.farms.listFarms({ query: { page: 1, limit: 20 } });
const farm = await client.farms.createFarm({ body: { name: 'My Farm', location: 'Kano' } });API Modules
Authentication
POST /auth/login- Login with email and passwordPOST /auth/signup- Register new userPOST /auth/google/initiate- Initiate Google OAuth flowPOST /auth/google/callback- Handle Google OAuth callbackPOST /auth/refresh- Refresh access tokenPOST /auth/logout- Logout userPOST /auth/password/reset-request- Request password resetPOST /auth/password/reset- Reset password with tokenPOST /auth/password/change- Change password (authenticated)POST /auth/email/verify- Verify email addressPOST /auth/email/resend-verification- Resend verification email
Users
GET /user/profile- Get current user profilePATCH /user/profile- Update user profile
Farms
GET /farms- List farmsPOST /farms- Create farmGET /farms/:id- Get farmPATCH /farms/:id- Update farmDELETE /farms/:id- Delete farm
Fields
GET /farms/:farmId/fields- List fieldsPOST /farms/:farmId/fields- Create fieldGET /farms/:farmId/fields/:id- Get fieldPATCH /farms/:farmId/fields/:id- Update fieldDELETE /farms/:farmId/fields/:id- Delete field
Tasks
GET /farms/:farmId/tasks- List tasksPOST /farms/:farmId/tasks- Create taskGET /farms/:farmId/tasks/:id- Get taskPATCH /farms/:farmId/tasks/:id- Update taskPOST /farms/:farmId/tasks/:id/complete- Complete taskDELETE /farms/:farmId/tasks/:id- Delete taskPOST /farms/:farmId/tasks/:id/notes- Add task note
Inventory
GET /farms/:farmId/inventory- List inventory itemsPOST /farms/:farmId/inventory- Create inventory itemGET /farms/:farmId/inventory/:id- Get inventory itemPATCH /farms/:farmId/inventory/:id- Update inventory itemDELETE /farms/:farmId/inventory/:id- Delete inventory itemPOST /farms/:farmId/inventory/purchase- Log purchase
Finance
- Budget:
GET,POST,PATCH,DELETE /farms/:farmId/budget - Expenses:
GET,POST,PATCH,DELETE /farms/:farmId/expenses - Revenue:
GET,POST,PATCH,DELETE /farms/:farmId/revenue GET /farms/:farmId/finance/summary- Finance summary
Harvest
GET /farms/:farmId/harvests- List harvestsPOST /farms/:farmId/harvests- Create harvestGET /farms/:farmId/harvests/:id- Get harvestPATCH /farms/:farmId/harvests/:id- Update harvestDELETE /farms/:farmId/harvests/:id- Delete harvest
Soil Tests
GET /farms/:farmId/soil-tests- List soil testsPOST /farms/:farmId/soil-tests- Create soil testGET /farms/:farmId/soil-tests/:id- Get soil testPATCH /farms/:farmId/soil-tests/:id- Update soil testDELETE /farms/:farmId/soil-tests/:id- Delete soil test
Weather
GET /farms/:farmId/weather- Get weather data
Team
GET /farms/:farmId/team- List team membersPOST /farms/:farmId/team- Create team memberGET /farms/:farmId/team/:id- Get team memberPATCH /farms/:farmId/team/:id- Update team memberDELETE /farms/:farmId/team/:id- Delete team member
Equipment
GET /farms/:farmId/equipment- List equipmentPOST /farms/:farmId/equipment- Create equipmentGET /farms/:farmId/equipment/:id- Get equipmentPATCH /farms/:farmId/equipment/:id- Update equipmentDELETE /farms/:farmId/equipment/:id- Delete equipmentPOST /farms/:farmId/equipment/:id/maintenance- Add maintenance record
Documents
GET /farms/:farmId/documents- List documentsPOST /farms/:farmId/documents- Create documentGET /farms/:farmId/documents/:id- Get documentPATCH /farms/:farmId/documents/:id- Update documentDELETE /farms/:farmId/documents/:id- Delete document
Suppliers
- Suppliers:
GET,POST,PATCH,DELETE /farms/:farmId/suppliers - Buyers:
GET,POST,PATCH,DELETE /farms/:farmId/buyers
Analytics
GET /farms/:farmId/analytics- Get analytics data
Common Features
Pagination
Most list endpoints support pagination:
{
page?: number; // Default: 1
limit?: number; // Default: 20, Max: 100
}Date Range Filtering
Many endpoints support date range filtering:
{
startDate?: string; // ISO datetime
endDate?: string; // ISO datetime
}GeoJSON Support
Farms and fields support GeoJSON geometry for boundaries:
{
type: 'Polygon' | 'MultiPolygon' | 'Point' | 'LineString';
coordinates: number[][][] | number[][] | number[];
}Error Responses
All endpoints return standardized error responses:
{
message: string;
code?: string;
errors?: Array<{
field?: string;
message: string;
}>;
}Type Safety
All schemas export TypeScript types:
import type {
FarmResponse,
CreateFarmInput,
FieldResponse,
TaskResponse,
// ... etc
} from '@farmpro/contracts';Development
Building
npm run buildType Checking
npm run type-checkPublishing
npm run prepublishOnly # Builds and validates
npm publishLicense
ISC
