@deepintel-ltd/farmpro-contracts 1.5.8 → 1.5.9
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/index.js +50 -92
- package/dist/routes/admin.routes.js +13 -16
- package/dist/routes/agent-workflows.routes.js +81 -84
- package/dist/routes/agents.routes.js +29 -32
- package/dist/routes/analytics.routes.js +11 -14
- package/dist/routes/auth.routes.js +55 -58
- package/dist/routes/categories.routes.js +23 -26
- package/dist/routes/documents.routes.js +67 -70
- package/dist/routes/equipment.routes.js +55 -58
- package/dist/routes/farms.routes.js +32 -35
- package/dist/routes/field-monitoring.routes.js +70 -73
- package/dist/routes/field-observations.routes.js +41 -44
- package/dist/routes/fields.routes.js +44 -47
- package/dist/routes/finance.routes.js +121 -124
- package/dist/routes/harvest.routes.js +46 -49
- package/dist/routes/health.routes.js +6 -9
- package/dist/routes/index.js +51 -54
- package/dist/routes/input-usage.routes.js +14 -17
- package/dist/routes/inventory.routes.js +57 -60
- package/dist/routes/seasonal-plans.routes.js +14 -17
- package/dist/routes/soil-tests.routes.js +45 -48
- package/dist/routes/suppliers.routes.js +70 -73
- package/dist/routes/tasks.routes.js +65 -68
- package/dist/routes/team.routes.js +57 -60
- package/dist/routes/users.routes.js +13 -16
- package/dist/routes/weather.routes.js +10 -13
- package/dist/schemas/admin.schemas.js +43 -46
- package/dist/schemas/agent-workflows.schemas.js +34 -37
- package/dist/schemas/agents.schemas.js +46 -49
- package/dist/schemas/analytics.schemas.js +51 -54
- package/dist/schemas/auth.schemas.js +96 -99
- package/dist/schemas/categories.schemas.js +27 -30
- package/dist/schemas/common.schemas.js +89 -95
- package/dist/schemas/documents.schemas.js +59 -62
- package/dist/schemas/equipment.schemas.js +86 -89
- package/dist/schemas/farms.schemas.js +40 -43
- package/dist/schemas/field-monitoring.schemas.js +207 -210
- package/dist/schemas/field-observations.schemas.js +93 -96
- package/dist/schemas/fields.schemas.js +82 -85
- package/dist/schemas/finance.schemas.js +134 -137
- package/dist/schemas/harvest.schemas.js +46 -49
- package/dist/schemas/health.schemas.js +14 -17
- package/dist/schemas/input-usage.schemas.js +21 -24
- package/dist/schemas/inventory.schemas.js +58 -61
- package/dist/schemas/recommendations.schemas.js +22 -25
- package/dist/schemas/seasonal-plans.schemas.js +21 -24
- package/dist/schemas/soil-tests.schemas.js +70 -73
- package/dist/schemas/suppliers.schemas.js +90 -93
- package/dist/schemas/tasks.schemas.js +93 -96
- package/dist/schemas/team.schemas.js +35 -38
- package/dist/schemas/users.schemas.js +19 -22
- package/dist/schemas/weather.schemas.js +32 -35
- package/package.json +9 -1
|
@@ -1,29 +1,26 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const common_schemas_1 = require("../schemas/common.schemas");
|
|
8
|
-
const c = (0, core_1.initContract)();
|
|
9
|
-
exports.harvestRouter = c.router({
|
|
1
|
+
import { initContract } from '@ts-rest/core';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { createHarvestSchema, updateHarvestSchema, harvestResponseSchema, harvestDetailResponseSchema, harvestListResponseSchema, } from '../schemas/harvest.schemas';
|
|
4
|
+
import { jsonApiErrorResponseSchema, jsonApiSuccessResponseSchema, jsonApiPaginationQuerySchema, jsonApiSortQuerySchema, jsonApiIncludeQuerySchema, jsonApiFilterQuerySchema } from '../schemas/common.schemas';
|
|
5
|
+
const c = initContract();
|
|
6
|
+
export const harvestRouter = c.router({
|
|
10
7
|
// List harvests for a farm
|
|
11
8
|
listHarvests: {
|
|
12
9
|
method: 'GET',
|
|
13
10
|
path: '/farms/:farmId/harvests',
|
|
14
|
-
pathParams:
|
|
15
|
-
query:
|
|
16
|
-
.merge(
|
|
17
|
-
.merge(
|
|
18
|
-
.merge(
|
|
19
|
-
.merge(
|
|
20
|
-
'filter[fieldId]':
|
|
21
|
-
'filter[crop]':
|
|
11
|
+
pathParams: z.object({ farmId: z.string().uuid() }),
|
|
12
|
+
query: jsonApiPaginationQuerySchema
|
|
13
|
+
.merge(jsonApiSortQuerySchema)
|
|
14
|
+
.merge(jsonApiIncludeQuerySchema)
|
|
15
|
+
.merge(jsonApiFilterQuerySchema)
|
|
16
|
+
.merge(z.object({
|
|
17
|
+
'filter[fieldId]': z.string().uuid().optional(),
|
|
18
|
+
'filter[crop]': z.string().optional(),
|
|
22
19
|
})),
|
|
23
20
|
responses: {
|
|
24
|
-
200:
|
|
25
|
-
404:
|
|
26
|
-
401:
|
|
21
|
+
200: harvestListResponseSchema,
|
|
22
|
+
404: jsonApiErrorResponseSchema,
|
|
23
|
+
401: jsonApiErrorResponseSchema,
|
|
27
24
|
},
|
|
28
25
|
summary: 'List harvests',
|
|
29
26
|
description: 'Get all harvest records for a farm',
|
|
@@ -32,14 +29,14 @@ exports.harvestRouter = c.router({
|
|
|
32
29
|
createHarvest: {
|
|
33
30
|
method: 'POST',
|
|
34
31
|
path: '/farms/:farmId/harvests',
|
|
35
|
-
pathParams:
|
|
36
|
-
body:
|
|
32
|
+
pathParams: z.object({ farmId: z.string().uuid() }),
|
|
33
|
+
body: z.object({ data: createHarvestSchema }),
|
|
37
34
|
responses: {
|
|
38
|
-
201:
|
|
39
|
-
400:
|
|
40
|
-
404:
|
|
41
|
-
401:
|
|
42
|
-
422:
|
|
35
|
+
201: harvestResponseSchema,
|
|
36
|
+
400: jsonApiErrorResponseSchema,
|
|
37
|
+
404: jsonApiErrorResponseSchema,
|
|
38
|
+
401: jsonApiErrorResponseSchema,
|
|
39
|
+
422: jsonApiErrorResponseSchema,
|
|
43
40
|
},
|
|
44
41
|
summary: 'Create harvest',
|
|
45
42
|
description: 'Record a new harvest with yield calculation',
|
|
@@ -48,15 +45,15 @@ exports.harvestRouter = c.router({
|
|
|
48
45
|
getHarvest: {
|
|
49
46
|
method: 'GET',
|
|
50
47
|
path: '/farms/:farmId/harvests/:id',
|
|
51
|
-
pathParams:
|
|
52
|
-
farmId:
|
|
53
|
-
id:
|
|
48
|
+
pathParams: z.object({
|
|
49
|
+
farmId: z.string().uuid(),
|
|
50
|
+
id: z.string().uuid(),
|
|
54
51
|
}),
|
|
55
|
-
query:
|
|
52
|
+
query: jsonApiIncludeQuerySchema,
|
|
56
53
|
responses: {
|
|
57
|
-
200:
|
|
58
|
-
404:
|
|
59
|
-
401:
|
|
54
|
+
200: harvestDetailResponseSchema,
|
|
55
|
+
404: jsonApiErrorResponseSchema,
|
|
56
|
+
401: jsonApiErrorResponseSchema,
|
|
60
57
|
},
|
|
61
58
|
summary: 'Get harvest by ID',
|
|
62
59
|
description: 'Get detailed information about a specific harvest',
|
|
@@ -65,17 +62,17 @@ exports.harvestRouter = c.router({
|
|
|
65
62
|
updateHarvest: {
|
|
66
63
|
method: 'PATCH',
|
|
67
64
|
path: '/farms/:farmId/harvests/:id',
|
|
68
|
-
pathParams:
|
|
69
|
-
farmId:
|
|
70
|
-
id:
|
|
65
|
+
pathParams: z.object({
|
|
66
|
+
farmId: z.string().uuid(),
|
|
67
|
+
id: z.string().uuid(),
|
|
71
68
|
}),
|
|
72
|
-
body:
|
|
69
|
+
body: z.object({ data: updateHarvestSchema }),
|
|
73
70
|
responses: {
|
|
74
|
-
200:
|
|
75
|
-
400:
|
|
76
|
-
404:
|
|
77
|
-
401:
|
|
78
|
-
422:
|
|
71
|
+
200: harvestResponseSchema,
|
|
72
|
+
400: jsonApiErrorResponseSchema,
|
|
73
|
+
404: jsonApiErrorResponseSchema,
|
|
74
|
+
401: jsonApiErrorResponseSchema,
|
|
75
|
+
422: jsonApiErrorResponseSchema,
|
|
79
76
|
},
|
|
80
77
|
summary: 'Update harvest',
|
|
81
78
|
description: 'Update harvest information',
|
|
@@ -84,14 +81,14 @@ exports.harvestRouter = c.router({
|
|
|
84
81
|
deleteHarvest: {
|
|
85
82
|
method: 'DELETE',
|
|
86
83
|
path: '/farms/:farmId/harvests/:id',
|
|
87
|
-
pathParams:
|
|
88
|
-
farmId:
|
|
89
|
-
id:
|
|
84
|
+
pathParams: z.object({
|
|
85
|
+
farmId: z.string().uuid(),
|
|
86
|
+
id: z.string().uuid(),
|
|
90
87
|
}),
|
|
91
88
|
responses: {
|
|
92
|
-
204:
|
|
93
|
-
404:
|
|
94
|
-
401:
|
|
89
|
+
204: jsonApiSuccessResponseSchema,
|
|
90
|
+
404: jsonApiErrorResponseSchema,
|
|
91
|
+
401: jsonApiErrorResponseSchema,
|
|
95
92
|
},
|
|
96
93
|
summary: 'Delete harvest',
|
|
97
94
|
description: 'Delete a harvest record',
|
|
@@ -1,16 +1,13 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
const health_schemas_1 = require("../schemas/health.schemas");
|
|
6
|
-
const c = (0, core_1.initContract)();
|
|
7
|
-
exports.healthRouter = c.router({
|
|
1
|
+
import { initContract } from '@ts-rest/core';
|
|
2
|
+
import { healthCheckResponseSchema } from '../schemas/health.schemas';
|
|
3
|
+
const c = initContract();
|
|
4
|
+
export const healthRouter = c.router({
|
|
8
5
|
check: {
|
|
9
6
|
method: 'GET',
|
|
10
7
|
path: '/health',
|
|
11
8
|
responses: {
|
|
12
|
-
200:
|
|
13
|
-
503:
|
|
9
|
+
200: healthCheckResponseSchema,
|
|
10
|
+
503: healthCheckResponseSchema, // Service unavailable
|
|
14
11
|
},
|
|
15
12
|
summary: 'Health check endpoint',
|
|
16
13
|
description: 'Check the health status of the API and its dependencies (database, Redis, storage)',
|
package/dist/routes/index.js
CHANGED
|
@@ -1,61 +1,58 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
const
|
|
27
|
-
const seasonal_plans_routes_1 = require("./seasonal-plans.routes");
|
|
28
|
-
const input_usage_routes_1 = require("./input-usage.routes");
|
|
29
|
-
const c = (0, core_1.initContract)();
|
|
1
|
+
import { initContract } from '@ts-rest/core';
|
|
2
|
+
import { authRouter } from './auth.routes';
|
|
3
|
+
import { usersRouter } from './users.routes';
|
|
4
|
+
import { farmsRouter } from './farms.routes';
|
|
5
|
+
import { fieldsRouter } from './fields.routes';
|
|
6
|
+
import { tasksRouter } from './tasks.routes';
|
|
7
|
+
import { inventoryRouter } from './inventory.routes';
|
|
8
|
+
import { financeRouter } from './finance.routes';
|
|
9
|
+
import { harvestRouter } from './harvest.routes';
|
|
10
|
+
import { soilTestsRouter } from './soil-tests.routes';
|
|
11
|
+
import { weatherRouter } from './weather.routes';
|
|
12
|
+
import { teamRouter } from './team.routes';
|
|
13
|
+
import { equipmentRouter } from './equipment.routes';
|
|
14
|
+
import { documentsRouter } from './documents.routes';
|
|
15
|
+
import { suppliersRouter } from './suppliers.routes';
|
|
16
|
+
import { analyticsRouter } from './analytics.routes';
|
|
17
|
+
import { categoriesRouter } from './categories.routes';
|
|
18
|
+
import { agentsRouter } from './agents.routes';
|
|
19
|
+
import { agentWorkflowsRouter } from './agent-workflows.routes';
|
|
20
|
+
import { fieldMonitoringRouter } from './field-monitoring.routes';
|
|
21
|
+
import { fieldObservationsRouter } from './field-observations.routes';
|
|
22
|
+
import { adminRouter } from './admin.routes';
|
|
23
|
+
import { healthRouter } from './health.routes';
|
|
24
|
+
import { seasonalPlansRouter } from './seasonal-plans.routes';
|
|
25
|
+
import { inputUsageRouter } from './input-usage.routes';
|
|
26
|
+
const c = initContract();
|
|
30
27
|
/**
|
|
31
28
|
* Main API contract combining all routers
|
|
32
29
|
*
|
|
33
30
|
* Uses explicit interface typing to work around TypeScript's type serialization limit
|
|
34
31
|
* when combining many complex router types. Type safety is fully maintained.
|
|
35
32
|
*/
|
|
36
|
-
|
|
37
|
-
auth:
|
|
38
|
-
users:
|
|
39
|
-
farms:
|
|
40
|
-
fields:
|
|
41
|
-
tasks:
|
|
42
|
-
inventory:
|
|
43
|
-
finance:
|
|
44
|
-
harvest:
|
|
45
|
-
soilTests:
|
|
46
|
-
weather:
|
|
47
|
-
team:
|
|
48
|
-
equipment:
|
|
49
|
-
documents:
|
|
50
|
-
suppliers:
|
|
51
|
-
analytics:
|
|
52
|
-
categories:
|
|
53
|
-
agents:
|
|
54
|
-
agentWorkflows:
|
|
55
|
-
fieldMonitoring:
|
|
56
|
-
fieldObservations:
|
|
57
|
-
admin:
|
|
58
|
-
health:
|
|
59
|
-
seasonalPlans:
|
|
60
|
-
inputUsage:
|
|
33
|
+
export const apiContract = c.router({
|
|
34
|
+
auth: authRouter,
|
|
35
|
+
users: usersRouter,
|
|
36
|
+
farms: farmsRouter,
|
|
37
|
+
fields: fieldsRouter,
|
|
38
|
+
tasks: tasksRouter,
|
|
39
|
+
inventory: inventoryRouter,
|
|
40
|
+
finance: financeRouter,
|
|
41
|
+
harvest: harvestRouter,
|
|
42
|
+
soilTests: soilTestsRouter,
|
|
43
|
+
weather: weatherRouter,
|
|
44
|
+
team: teamRouter,
|
|
45
|
+
equipment: equipmentRouter,
|
|
46
|
+
documents: documentsRouter,
|
|
47
|
+
suppliers: suppliersRouter,
|
|
48
|
+
analytics: analyticsRouter,
|
|
49
|
+
categories: categoriesRouter,
|
|
50
|
+
agents: agentsRouter,
|
|
51
|
+
agentWorkflows: agentWorkflowsRouter,
|
|
52
|
+
fieldMonitoring: fieldMonitoringRouter,
|
|
53
|
+
fieldObservations: fieldObservationsRouter,
|
|
54
|
+
admin: adminRouter,
|
|
55
|
+
health: healthRouter,
|
|
56
|
+
seasonalPlans: seasonalPlansRouter,
|
|
57
|
+
inputUsage: inputUsageRouter,
|
|
61
58
|
});
|
|
@@ -1,26 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const common_schemas_1 = require("../schemas/common.schemas");
|
|
8
|
-
const c = (0, core_1.initContract)();
|
|
9
|
-
exports.inputUsageRouter = c.router({
|
|
1
|
+
import { initContract } from '@ts-rest/core';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { inputUsageResponseSchema, } from '../schemas/input-usage.schemas';
|
|
4
|
+
import { jsonApiErrorResponseSchema, } from '../schemas/common.schemas';
|
|
5
|
+
const c = initContract();
|
|
6
|
+
export const inputUsageRouter = c.router({
|
|
10
7
|
// Get input usage for a farm
|
|
11
8
|
getInputUsage: {
|
|
12
9
|
method: 'GET',
|
|
13
10
|
path: '/farms/:farmId/input-usage',
|
|
14
|
-
pathParams:
|
|
15
|
-
query:
|
|
16
|
-
season:
|
|
17
|
-
'filter[startDate]':
|
|
18
|
-
'filter[endDate]':
|
|
11
|
+
pathParams: z.object({ farmId: z.string().uuid() }),
|
|
12
|
+
query: z.object({
|
|
13
|
+
season: z.string().optional(), // e.g., "2024-2025"
|
|
14
|
+
'filter[startDate]': z.string().datetime().optional(),
|
|
15
|
+
'filter[endDate]': z.string().datetime().optional(),
|
|
19
16
|
}),
|
|
20
17
|
responses: {
|
|
21
|
-
200:
|
|
22
|
-
404:
|
|
23
|
-
401:
|
|
18
|
+
200: inputUsageResponseSchema,
|
|
19
|
+
404: jsonApiErrorResponseSchema,
|
|
20
|
+
401: jsonApiErrorResponseSchema,
|
|
24
21
|
},
|
|
25
22
|
summary: 'Get input usage',
|
|
26
23
|
description: 'Get input usage with planned vs actual metrics calculated from tasks that reference inventory items',
|
|
@@ -1,28 +1,25 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const common_schemas_1 = require("../schemas/common.schemas");
|
|
8
|
-
const c = (0, core_1.initContract)();
|
|
9
|
-
exports.inventoryRouter = c.router({
|
|
1
|
+
import { initContract } from '@ts-rest/core';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { logPurchaseSchema, createInventoryItemSchema, updateInventoryItemSchema, inventoryItemResponseSchema, inventoryItemDetailResponseSchema, inventoryItemListResponseSchema, } from '../schemas/inventory.schemas';
|
|
4
|
+
import { jsonApiErrorResponseSchema, jsonApiSuccessResponseSchema, jsonApiPaginationQuerySchema, jsonApiSortQuerySchema, jsonApiIncludeQuerySchema, jsonApiSingleResponseSchema } from '../schemas/common.schemas';
|
|
5
|
+
const c = initContract();
|
|
6
|
+
export const inventoryRouter = c.router({
|
|
10
7
|
// List inventory items for a farm
|
|
11
8
|
listInventory: {
|
|
12
9
|
method: 'GET',
|
|
13
10
|
path: '/farms/:farmId/inventory',
|
|
14
|
-
pathParams:
|
|
15
|
-
query:
|
|
16
|
-
.merge(
|
|
17
|
-
.merge(
|
|
18
|
-
.merge(
|
|
19
|
-
'filter[category]':
|
|
20
|
-
'filter[lowStock]':
|
|
11
|
+
pathParams: z.object({ farmId: z.string().uuid() }),
|
|
12
|
+
query: jsonApiPaginationQuerySchema
|
|
13
|
+
.merge(jsonApiSortQuerySchema)
|
|
14
|
+
.merge(jsonApiIncludeQuerySchema)
|
|
15
|
+
.merge(z.object({
|
|
16
|
+
'filter[category]': z.string().optional(),
|
|
17
|
+
'filter[lowStock]': z.coerce.boolean().optional(), // Filter items with low stock
|
|
21
18
|
})),
|
|
22
19
|
responses: {
|
|
23
|
-
200:
|
|
24
|
-
404:
|
|
25
|
-
401:
|
|
20
|
+
200: inventoryItemListResponseSchema,
|
|
21
|
+
404: jsonApiErrorResponseSchema,
|
|
22
|
+
401: jsonApiErrorResponseSchema,
|
|
26
23
|
},
|
|
27
24
|
summary: 'List inventory items',
|
|
28
25
|
description: 'Get all inventory items for a specific farm',
|
|
@@ -31,14 +28,14 @@ exports.inventoryRouter = c.router({
|
|
|
31
28
|
createInventoryItem: {
|
|
32
29
|
method: 'POST',
|
|
33
30
|
path: '/farms/:farmId/inventory',
|
|
34
|
-
pathParams:
|
|
35
|
-
body:
|
|
31
|
+
pathParams: z.object({ farmId: z.string().uuid() }),
|
|
32
|
+
body: z.object({ data: createInventoryItemSchema }),
|
|
36
33
|
responses: {
|
|
37
|
-
201:
|
|
38
|
-
400:
|
|
39
|
-
404:
|
|
40
|
-
401:
|
|
41
|
-
422:
|
|
34
|
+
201: inventoryItemResponseSchema,
|
|
35
|
+
400: jsonApiErrorResponseSchema,
|
|
36
|
+
404: jsonApiErrorResponseSchema,
|
|
37
|
+
401: jsonApiErrorResponseSchema,
|
|
38
|
+
422: jsonApiErrorResponseSchema,
|
|
42
39
|
},
|
|
43
40
|
summary: 'Create inventory item',
|
|
44
41
|
description: 'Create a new inventory item without logging a purchase',
|
|
@@ -47,15 +44,15 @@ exports.inventoryRouter = c.router({
|
|
|
47
44
|
getInventoryItem: {
|
|
48
45
|
method: 'GET',
|
|
49
46
|
path: '/farms/:farmId/inventory/:id',
|
|
50
|
-
pathParams:
|
|
51
|
-
farmId:
|
|
52
|
-
id:
|
|
47
|
+
pathParams: z.object({
|
|
48
|
+
farmId: z.string().uuid(),
|
|
49
|
+
id: z.string().uuid(),
|
|
53
50
|
}),
|
|
54
|
-
query:
|
|
51
|
+
query: jsonApiIncludeQuerySchema,
|
|
55
52
|
responses: {
|
|
56
|
-
200:
|
|
57
|
-
404:
|
|
58
|
-
401:
|
|
53
|
+
200: inventoryItemDetailResponseSchema,
|
|
54
|
+
404: jsonApiErrorResponseSchema,
|
|
55
|
+
401: jsonApiErrorResponseSchema,
|
|
59
56
|
},
|
|
60
57
|
summary: 'Get inventory item by ID',
|
|
61
58
|
description: 'Get detailed information about a specific inventory item',
|
|
@@ -64,17 +61,17 @@ exports.inventoryRouter = c.router({
|
|
|
64
61
|
updateInventoryItem: {
|
|
65
62
|
method: 'PATCH',
|
|
66
63
|
path: '/farms/:farmId/inventory/:id',
|
|
67
|
-
pathParams:
|
|
68
|
-
farmId:
|
|
69
|
-
id:
|
|
64
|
+
pathParams: z.object({
|
|
65
|
+
farmId: z.string().uuid(),
|
|
66
|
+
id: z.string().uuid(),
|
|
70
67
|
}),
|
|
71
|
-
body:
|
|
68
|
+
body: z.object({ data: updateInventoryItemSchema }),
|
|
72
69
|
responses: {
|
|
73
|
-
200:
|
|
74
|
-
400:
|
|
75
|
-
404:
|
|
76
|
-
401:
|
|
77
|
-
422:
|
|
70
|
+
200: inventoryItemResponseSchema,
|
|
71
|
+
400: jsonApiErrorResponseSchema,
|
|
72
|
+
404: jsonApiErrorResponseSchema,
|
|
73
|
+
401: jsonApiErrorResponseSchema,
|
|
74
|
+
422: jsonApiErrorResponseSchema,
|
|
78
75
|
},
|
|
79
76
|
summary: 'Update inventory item',
|
|
80
77
|
description: 'Update inventory item information',
|
|
@@ -83,14 +80,14 @@ exports.inventoryRouter = c.router({
|
|
|
83
80
|
deleteInventoryItem: {
|
|
84
81
|
method: 'DELETE',
|
|
85
82
|
path: '/farms/:farmId/inventory/:id',
|
|
86
|
-
pathParams:
|
|
87
|
-
farmId:
|
|
88
|
-
id:
|
|
83
|
+
pathParams: z.object({
|
|
84
|
+
farmId: z.string().uuid(),
|
|
85
|
+
id: z.string().uuid(),
|
|
89
86
|
}),
|
|
90
87
|
responses: {
|
|
91
|
-
204:
|
|
92
|
-
404:
|
|
93
|
-
401:
|
|
88
|
+
204: jsonApiSuccessResponseSchema,
|
|
89
|
+
404: jsonApiErrorResponseSchema,
|
|
90
|
+
401: jsonApiErrorResponseSchema,
|
|
94
91
|
},
|
|
95
92
|
summary: 'Delete inventory item',
|
|
96
93
|
description: 'Delete an inventory item',
|
|
@@ -99,21 +96,21 @@ exports.inventoryRouter = c.router({
|
|
|
99
96
|
logPurchase: {
|
|
100
97
|
method: 'POST',
|
|
101
98
|
path: '/farms/:farmId/inventory/purchase',
|
|
102
|
-
pathParams:
|
|
103
|
-
body:
|
|
99
|
+
pathParams: z.object({ farmId: z.string().uuid() }),
|
|
100
|
+
body: z.object({ data: logPurchaseSchema }),
|
|
104
101
|
responses: {
|
|
105
|
-
201:
|
|
106
|
-
type:
|
|
107
|
-
id:
|
|
108
|
-
attributes:
|
|
109
|
-
inventoryItemId:
|
|
110
|
-
expenseId:
|
|
102
|
+
201: jsonApiSingleResponseSchema(z.object({
|
|
103
|
+
type: z.literal('purchase-results'),
|
|
104
|
+
id: z.string().uuid(),
|
|
105
|
+
attributes: z.object({
|
|
106
|
+
inventoryItemId: z.string().uuid(),
|
|
107
|
+
expenseId: z.string().uuid().optional(), // Created expense ID
|
|
111
108
|
}),
|
|
112
109
|
})),
|
|
113
|
-
400:
|
|
114
|
-
404:
|
|
115
|
-
401:
|
|
116
|
-
422:
|
|
110
|
+
400: jsonApiErrorResponseSchema,
|
|
111
|
+
404: jsonApiErrorResponseSchema,
|
|
112
|
+
401: jsonApiErrorResponseSchema,
|
|
113
|
+
422: jsonApiErrorResponseSchema,
|
|
117
114
|
},
|
|
118
115
|
summary: 'Log purchase',
|
|
119
116
|
description: 'Log a purchase that updates inventory and creates an expense',
|
|
@@ -1,26 +1,23 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
const
|
|
6
|
-
const
|
|
7
|
-
const common_schemas_1 = require("../schemas/common.schemas");
|
|
8
|
-
const c = (0, core_1.initContract)();
|
|
9
|
-
exports.seasonalPlansRouter = c.router({
|
|
1
|
+
import { initContract } from '@ts-rest/core';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { seasonalPlanResponseSchema, } from '../schemas/seasonal-plans.schemas';
|
|
4
|
+
import { jsonApiErrorResponseSchema, } from '../schemas/common.schemas';
|
|
5
|
+
const c = initContract();
|
|
6
|
+
export const seasonalPlansRouter = c.router({
|
|
10
7
|
// Get seasonal plan progress for a farm
|
|
11
8
|
getSeasonalPlan: {
|
|
12
9
|
method: 'GET',
|
|
13
10
|
path: '/farms/:farmId/seasonal-plans',
|
|
14
|
-
pathParams:
|
|
15
|
-
query:
|
|
16
|
-
season:
|
|
17
|
-
'filter[startDate]':
|
|
18
|
-
'filter[endDate]':
|
|
11
|
+
pathParams: z.object({ farmId: z.string().uuid() }),
|
|
12
|
+
query: z.object({
|
|
13
|
+
season: z.string().optional(), // e.g., "2024-2025"
|
|
14
|
+
'filter[startDate]': z.string().datetime().optional(),
|
|
15
|
+
'filter[endDate]': z.string().datetime().optional(),
|
|
19
16
|
}),
|
|
20
17
|
responses: {
|
|
21
|
-
200:
|
|
22
|
-
404:
|
|
23
|
-
401:
|
|
18
|
+
200: seasonalPlanResponseSchema,
|
|
19
|
+
404: jsonApiErrorResponseSchema,
|
|
20
|
+
401: jsonApiErrorResponseSchema,
|
|
24
21
|
},
|
|
25
22
|
summary: 'Get seasonal plan progress',
|
|
26
23
|
description: 'Get seasonal plan progress with planned vs actual metrics calculated from tasks and field data',
|