@deepintel-ltd/farmpro-contracts 1.5.7 → 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.equipmentRouter = c.router({
|
|
1
|
+
import { initContract } from '@ts-rest/core';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { createEquipmentSchema, updateEquipmentSchema, createMaintenanceRecordSchema, equipmentResponseSchema, equipmentListResponseSchema, maintenanceRecordSchema, equipmentTypeSchema, equipmentStatusSchema, } from '../schemas/equipment.schemas';
|
|
4
|
+
import { jsonApiErrorResponseSchema, jsonApiSuccessResponseSchema, jsonApiPaginationQuerySchema, jsonApiSortQuerySchema, jsonApiIncludeQuerySchema, jsonApiFilterQuerySchema } from '../schemas/common.schemas';
|
|
5
|
+
const c = initContract();
|
|
6
|
+
export const equipmentRouter = c.router({
|
|
10
7
|
// List equipment for a farm
|
|
11
8
|
listEquipment: {
|
|
12
9
|
method: 'GET',
|
|
13
10
|
path: '/farms/:farmId/equipment',
|
|
14
|
-
pathParams:
|
|
15
|
-
query:
|
|
16
|
-
.merge(
|
|
17
|
-
.merge(
|
|
18
|
-
.merge(
|
|
19
|
-
.merge(
|
|
20
|
-
'filter[type]':
|
|
21
|
-
'filter[status]':
|
|
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[type]': equipmentTypeSchema.optional(),
|
|
18
|
+
'filter[status]': equipmentStatusSchema.optional(),
|
|
22
19
|
})),
|
|
23
20
|
responses: {
|
|
24
|
-
200:
|
|
25
|
-
404:
|
|
26
|
-
401:
|
|
21
|
+
200: equipmentListResponseSchema,
|
|
22
|
+
404: jsonApiErrorResponseSchema,
|
|
23
|
+
401: jsonApiErrorResponseSchema,
|
|
27
24
|
},
|
|
28
25
|
summary: 'List equipment',
|
|
29
26
|
description: 'Get all equipment for a farm with optional filtering',
|
|
@@ -32,14 +29,14 @@ exports.equipmentRouter = c.router({
|
|
|
32
29
|
createEquipment: {
|
|
33
30
|
method: 'POST',
|
|
34
31
|
path: '/farms/:farmId/equipment',
|
|
35
|
-
pathParams:
|
|
36
|
-
body:
|
|
32
|
+
pathParams: z.object({ farmId: z.string().uuid() }),
|
|
33
|
+
body: z.object({ data: createEquipmentSchema }),
|
|
37
34
|
responses: {
|
|
38
|
-
201:
|
|
39
|
-
400:
|
|
40
|
-
404:
|
|
41
|
-
401:
|
|
42
|
-
422:
|
|
35
|
+
201: equipmentResponseSchema,
|
|
36
|
+
400: jsonApiErrorResponseSchema,
|
|
37
|
+
404: jsonApiErrorResponseSchema,
|
|
38
|
+
401: jsonApiErrorResponseSchema,
|
|
39
|
+
422: jsonApiErrorResponseSchema,
|
|
43
40
|
},
|
|
44
41
|
summary: 'Create equipment',
|
|
45
42
|
description: 'Add new equipment to the farm',
|
|
@@ -48,15 +45,15 @@ exports.equipmentRouter = c.router({
|
|
|
48
45
|
getEquipment: {
|
|
49
46
|
method: 'GET',
|
|
50
47
|
path: '/farms/:farmId/equipment/: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: equipmentResponseSchema,
|
|
55
|
+
404: jsonApiErrorResponseSchema,
|
|
56
|
+
401: jsonApiErrorResponseSchema,
|
|
60
57
|
},
|
|
61
58
|
summary: 'Get equipment by ID',
|
|
62
59
|
description: 'Get detailed information about equipment',
|
|
@@ -65,17 +62,17 @@ exports.equipmentRouter = c.router({
|
|
|
65
62
|
updateEquipment: {
|
|
66
63
|
method: 'PATCH',
|
|
67
64
|
path: '/farms/:farmId/equipment/: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: updateEquipmentSchema }),
|
|
73
70
|
responses: {
|
|
74
|
-
200:
|
|
75
|
-
400:
|
|
76
|
-
404:
|
|
77
|
-
401:
|
|
78
|
-
422:
|
|
71
|
+
200: equipmentResponseSchema,
|
|
72
|
+
400: jsonApiErrorResponseSchema,
|
|
73
|
+
404: jsonApiErrorResponseSchema,
|
|
74
|
+
401: jsonApiErrorResponseSchema,
|
|
75
|
+
422: jsonApiErrorResponseSchema,
|
|
79
76
|
},
|
|
80
77
|
summary: 'Update equipment',
|
|
81
78
|
description: 'Update equipment information',
|
|
@@ -84,14 +81,14 @@ exports.equipmentRouter = c.router({
|
|
|
84
81
|
deleteEquipment: {
|
|
85
82
|
method: 'DELETE',
|
|
86
83
|
path: '/farms/:farmId/equipment/: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 equipment',
|
|
97
94
|
description: 'Delete equipment record',
|
|
@@ -100,17 +97,17 @@ exports.equipmentRouter = c.router({
|
|
|
100
97
|
addMaintenanceRecord: {
|
|
101
98
|
method: 'POST',
|
|
102
99
|
path: '/farms/:farmId/equipment/:id/maintenance',
|
|
103
|
-
pathParams:
|
|
104
|
-
farmId:
|
|
105
|
-
id:
|
|
100
|
+
pathParams: z.object({
|
|
101
|
+
farmId: z.string().uuid(),
|
|
102
|
+
id: z.string().uuid(),
|
|
106
103
|
}),
|
|
107
|
-
body:
|
|
104
|
+
body: z.object({ data: createMaintenanceRecordSchema }),
|
|
108
105
|
responses: {
|
|
109
|
-
201:
|
|
110
|
-
400:
|
|
111
|
-
404:
|
|
112
|
-
401:
|
|
113
|
-
422:
|
|
106
|
+
201: maintenanceRecordSchema,
|
|
107
|
+
400: jsonApiErrorResponseSchema,
|
|
108
|
+
404: jsonApiErrorResponseSchema,
|
|
109
|
+
401: jsonApiErrorResponseSchema,
|
|
110
|
+
422: jsonApiErrorResponseSchema,
|
|
114
111
|
},
|
|
115
112
|
summary: 'Add maintenance record',
|
|
116
113
|
description: 'Record maintenance performed on equipment',
|
|
@@ -1,22 +1,19 @@
|
|
|
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.farmsRouter = c.router({
|
|
1
|
+
import { initContract } from '@ts-rest/core';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { createFarmSchema, updateFarmSchema, farmResponseSchema, farmDetailResponseSchema, farmListResponseSchema, } from '../schemas/farms.schemas';
|
|
4
|
+
import { jsonApiErrorResponseSchema, jsonApiSuccessResponseSchema, idParamSchema, jsonApiPaginationQuerySchema, jsonApiSortQuerySchema, jsonApiIncludeQuerySchema } from '../schemas/common.schemas';
|
|
5
|
+
const c = initContract();
|
|
6
|
+
export const farmsRouter = c.router({
|
|
10
7
|
// List all farms for the authenticated user
|
|
11
8
|
listFarms: {
|
|
12
9
|
method: 'GET',
|
|
13
10
|
path: '/farms',
|
|
14
|
-
query:
|
|
15
|
-
.merge(
|
|
16
|
-
.merge(
|
|
11
|
+
query: jsonApiPaginationQuerySchema
|
|
12
|
+
.merge(jsonApiSortQuerySchema)
|
|
13
|
+
.merge(jsonApiIncludeQuerySchema),
|
|
17
14
|
responses: {
|
|
18
|
-
200:
|
|
19
|
-
401:
|
|
15
|
+
200: farmListResponseSchema,
|
|
16
|
+
401: jsonApiErrorResponseSchema,
|
|
20
17
|
},
|
|
21
18
|
summary: 'List all farms',
|
|
22
19
|
description: 'Get a paginated list of farms for the authenticated user',
|
|
@@ -43,12 +40,12 @@ exports.farmsRouter = c.router({
|
|
|
43
40
|
createFarm: {
|
|
44
41
|
method: 'POST',
|
|
45
42
|
path: '/farms',
|
|
46
|
-
body:
|
|
43
|
+
body: z.object({ data: createFarmSchema }),
|
|
47
44
|
responses: {
|
|
48
|
-
201:
|
|
49
|
-
400:
|
|
50
|
-
401:
|
|
51
|
-
422:
|
|
45
|
+
201: farmResponseSchema,
|
|
46
|
+
400: jsonApiErrorResponseSchema,
|
|
47
|
+
401: jsonApiErrorResponseSchema,
|
|
48
|
+
422: jsonApiErrorResponseSchema,
|
|
52
49
|
},
|
|
53
50
|
summary: 'Create a new farm',
|
|
54
51
|
description: 'Create a new farm with optional boundary',
|
|
@@ -69,12 +66,12 @@ exports.farmsRouter = c.router({
|
|
|
69
66
|
getFarm: {
|
|
70
67
|
method: 'GET',
|
|
71
68
|
path: '/farms/:id',
|
|
72
|
-
pathParams:
|
|
73
|
-
query:
|
|
69
|
+
pathParams: idParamSchema,
|
|
70
|
+
query: jsonApiIncludeQuerySchema,
|
|
74
71
|
responses: {
|
|
75
|
-
200:
|
|
76
|
-
404:
|
|
77
|
-
401:
|
|
72
|
+
200: farmDetailResponseSchema,
|
|
73
|
+
404: jsonApiErrorResponseSchema,
|
|
74
|
+
401: jsonApiErrorResponseSchema,
|
|
78
75
|
},
|
|
79
76
|
summary: 'Get farm by ID',
|
|
80
77
|
description: 'Get detailed information about a specific farm',
|
|
@@ -83,14 +80,14 @@ exports.farmsRouter = c.router({
|
|
|
83
80
|
updateFarm: {
|
|
84
81
|
method: 'PATCH',
|
|
85
82
|
path: '/farms/:id',
|
|
86
|
-
pathParams:
|
|
87
|
-
body:
|
|
83
|
+
pathParams: idParamSchema,
|
|
84
|
+
body: z.object({ data: updateFarmSchema }),
|
|
88
85
|
responses: {
|
|
89
|
-
200:
|
|
90
|
-
400:
|
|
91
|
-
404:
|
|
92
|
-
401:
|
|
93
|
-
422:
|
|
86
|
+
200: farmResponseSchema,
|
|
87
|
+
400: jsonApiErrorResponseSchema,
|
|
88
|
+
404: jsonApiErrorResponseSchema,
|
|
89
|
+
401: jsonApiErrorResponseSchema,
|
|
90
|
+
422: jsonApiErrorResponseSchema,
|
|
94
91
|
},
|
|
95
92
|
summary: 'Update farm',
|
|
96
93
|
description: 'Update farm information including boundary',
|
|
@@ -99,11 +96,11 @@ exports.farmsRouter = c.router({
|
|
|
99
96
|
deleteFarm: {
|
|
100
97
|
method: 'DELETE',
|
|
101
98
|
path: '/farms/:id',
|
|
102
|
-
pathParams:
|
|
99
|
+
pathParams: idParamSchema,
|
|
103
100
|
responses: {
|
|
104
|
-
204:
|
|
105
|
-
404:
|
|
106
|
-
401:
|
|
101
|
+
204: jsonApiSuccessResponseSchema,
|
|
102
|
+
404: jsonApiErrorResponseSchema,
|
|
103
|
+
401: jsonApiErrorResponseSchema,
|
|
107
104
|
},
|
|
108
105
|
summary: 'Delete farm',
|
|
109
106
|
description: 'Delete a farm and all associated data',
|
|
@@ -1,18 +1,15 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
const
|
|
5
|
-
const
|
|
6
|
-
const field_monitoring_schemas_1 = require("../schemas/field-monitoring.schemas");
|
|
7
|
-
const c = (0, core_1.initContract)();
|
|
8
|
-
exports.fieldMonitoringRouter = c.router({
|
|
1
|
+
import { initContract } from '@ts-rest/core';
|
|
2
|
+
import { z } from 'zod';
|
|
3
|
+
import { fieldMonitoringSummarySchema, ndviTrendDataPointSchema, weeklyNDVIStatsSchema, fieldAlertSchema, fieldComparisonSchema, farmMonitoringStatsSchema, ndviTrendQuerySchema, alertsQuerySchema, triggerAnalysisResponseSchema, fieldMonitoringErrorResponseSchema, soilReadingSchema, soilTrendSchema, historicalNDVIDataPointSchema, intelligentSoilProfileSchema, } from '../schemas/field-monitoring.schemas';
|
|
4
|
+
const c = initContract();
|
|
5
|
+
export const fieldMonitoringRouter = c.router({
|
|
9
6
|
// Get current monitoring status for a field
|
|
10
7
|
getFieldStatus: {
|
|
11
8
|
method: 'GET',
|
|
12
9
|
path: '/farms/:farmId/fields/:fieldId/monitoring',
|
|
13
10
|
responses: {
|
|
14
|
-
200:
|
|
15
|
-
404:
|
|
11
|
+
200: fieldMonitoringSummarySchema,
|
|
12
|
+
404: fieldMonitoringErrorResponseSchema,
|
|
16
13
|
},
|
|
17
14
|
summary: 'Get current monitoring status for a field',
|
|
18
15
|
},
|
|
@@ -20,13 +17,13 @@ exports.fieldMonitoringRouter = c.router({
|
|
|
20
17
|
getNDVITrend: {
|
|
21
18
|
method: 'GET',
|
|
22
19
|
path: '/farms/:farmId/fields/:fieldId/monitoring/ndvi-trend',
|
|
23
|
-
query:
|
|
20
|
+
query: ndviTrendQuerySchema,
|
|
24
21
|
responses: {
|
|
25
|
-
200:
|
|
26
|
-
|
|
27
|
-
|
|
22
|
+
200: z.union([
|
|
23
|
+
z.array(ndviTrendDataPointSchema),
|
|
24
|
+
z.array(weeklyNDVIStatsSchema),
|
|
28
25
|
]),
|
|
29
|
-
404:
|
|
26
|
+
404: fieldMonitoringErrorResponseSchema,
|
|
30
27
|
},
|
|
31
28
|
summary: 'Get NDVI trend for date range',
|
|
32
29
|
},
|
|
@@ -34,9 +31,9 @@ exports.fieldMonitoringRouter = c.router({
|
|
|
34
31
|
getFieldAlerts: {
|
|
35
32
|
method: 'GET',
|
|
36
33
|
path: '/farms/:farmId/fields/:fieldId/monitoring/alerts',
|
|
37
|
-
query:
|
|
34
|
+
query: alertsQuerySchema,
|
|
38
35
|
responses: {
|
|
39
|
-
200:
|
|
36
|
+
200: z.array(fieldAlertSchema),
|
|
40
37
|
},
|
|
41
38
|
summary: 'Get alerts for a field',
|
|
42
39
|
},
|
|
@@ -44,9 +41,9 @@ exports.fieldMonitoringRouter = c.router({
|
|
|
44
41
|
getFarmAlerts: {
|
|
45
42
|
method: 'GET',
|
|
46
43
|
path: '/farms/:farmId/monitoring/alerts',
|
|
47
|
-
query:
|
|
44
|
+
query: alertsQuerySchema,
|
|
48
45
|
responses: {
|
|
49
|
-
200:
|
|
46
|
+
200: z.array(fieldAlertSchema),
|
|
50
47
|
},
|
|
51
48
|
summary: 'Get all alerts for a farm',
|
|
52
49
|
},
|
|
@@ -55,7 +52,7 @@ exports.fieldMonitoringRouter = c.router({
|
|
|
55
52
|
method: 'GET',
|
|
56
53
|
path: '/farms/:farmId/monitoring/compare',
|
|
57
54
|
responses: {
|
|
58
|
-
200:
|
|
55
|
+
200: z.array(fieldComparisonSchema),
|
|
59
56
|
},
|
|
60
57
|
summary: 'Compare health across all fields in a farm',
|
|
61
58
|
},
|
|
@@ -64,7 +61,7 @@ exports.fieldMonitoringRouter = c.router({
|
|
|
64
61
|
method: 'GET',
|
|
65
62
|
path: '/farms/:farmId/monitoring/stats',
|
|
66
63
|
responses: {
|
|
67
|
-
200:
|
|
64
|
+
200: farmMonitoringStatsSchema,
|
|
68
65
|
},
|
|
69
66
|
summary: 'Get monitoring statistics for a farm',
|
|
70
67
|
},
|
|
@@ -72,10 +69,10 @@ exports.fieldMonitoringRouter = c.router({
|
|
|
72
69
|
acknowledgeAlert: {
|
|
73
70
|
method: 'PATCH',
|
|
74
71
|
path: '/farms/:farmId/monitoring/alerts/:alertId/acknowledge',
|
|
75
|
-
body:
|
|
72
|
+
body: z.object({}),
|
|
76
73
|
responses: {
|
|
77
|
-
200:
|
|
78
|
-
404:
|
|
74
|
+
200: fieldAlertSchema,
|
|
75
|
+
404: fieldMonitoringErrorResponseSchema,
|
|
79
76
|
},
|
|
80
77
|
summary: 'Acknowledge an alert',
|
|
81
78
|
},
|
|
@@ -83,10 +80,10 @@ exports.fieldMonitoringRouter = c.router({
|
|
|
83
80
|
resolveAlert: {
|
|
84
81
|
method: 'PATCH',
|
|
85
82
|
path: '/farms/:farmId/monitoring/alerts/:alertId/resolve',
|
|
86
|
-
body:
|
|
83
|
+
body: z.object({}),
|
|
87
84
|
responses: {
|
|
88
|
-
200:
|
|
89
|
-
404:
|
|
85
|
+
200: fieldAlertSchema,
|
|
86
|
+
404: fieldMonitoringErrorResponseSchema,
|
|
90
87
|
},
|
|
91
88
|
summary: 'Resolve an alert',
|
|
92
89
|
},
|
|
@@ -94,15 +91,15 @@ exports.fieldMonitoringRouter = c.router({
|
|
|
94
91
|
triggerAnalysis: {
|
|
95
92
|
method: 'POST',
|
|
96
93
|
path: '/farms/:farmId/fields/:fieldId/monitoring/analyze',
|
|
97
|
-
body:
|
|
98
|
-
force:
|
|
94
|
+
body: z.object({
|
|
95
|
+
force: z.boolean().optional().default(false),
|
|
99
96
|
}),
|
|
100
97
|
responses: {
|
|
101
|
-
200:
|
|
102
|
-
202:
|
|
103
|
-
404:
|
|
104
|
-
500:
|
|
105
|
-
503:
|
|
98
|
+
200: triggerAnalysisResponseSchema,
|
|
99
|
+
202: triggerAnalysisResponseSchema,
|
|
100
|
+
404: fieldMonitoringErrorResponseSchema,
|
|
101
|
+
500: fieldMonitoringErrorResponseSchema,
|
|
102
|
+
503: fieldMonitoringErrorResponseSchema,
|
|
106
103
|
},
|
|
107
104
|
summary: 'Manually trigger field analysis',
|
|
108
105
|
},
|
|
@@ -110,16 +107,16 @@ exports.fieldMonitoringRouter = c.router({
|
|
|
110
107
|
retryFailedJobs: {
|
|
111
108
|
method: 'POST',
|
|
112
109
|
path: '/farms/:farmId/monitoring/queue/retry-failed',
|
|
113
|
-
body:
|
|
114
|
-
responses: {
|
|
115
|
-
200:
|
|
116
|
-
message:
|
|
117
|
-
retriedCount:
|
|
118
|
-
failedJobIds:
|
|
119
|
-
skippedCount:
|
|
120
|
-
skippedJobIds:
|
|
110
|
+
body: z.object({}),
|
|
111
|
+
responses: {
|
|
112
|
+
200: z.object({
|
|
113
|
+
message: z.string(),
|
|
114
|
+
retriedCount: z.number(),
|
|
115
|
+
failedJobIds: z.array(z.string()),
|
|
116
|
+
skippedCount: z.number(),
|
|
117
|
+
skippedJobIds: z.array(z.string()),
|
|
121
118
|
}),
|
|
122
|
-
500:
|
|
119
|
+
500: fieldMonitoringErrorResponseSchema,
|
|
123
120
|
},
|
|
124
121
|
summary: 'Retry all failed field analysis jobs',
|
|
125
122
|
},
|
|
@@ -128,14 +125,14 @@ exports.fieldMonitoringRouter = c.router({
|
|
|
128
125
|
method: 'GET',
|
|
129
126
|
path: '/farms/:farmId/monitoring/queue/stats',
|
|
130
127
|
responses: {
|
|
131
|
-
200:
|
|
132
|
-
waiting:
|
|
133
|
-
active:
|
|
134
|
-
delayed:
|
|
135
|
-
failed:
|
|
136
|
-
completed:
|
|
128
|
+
200: z.object({
|
|
129
|
+
waiting: z.number(),
|
|
130
|
+
active: z.number(),
|
|
131
|
+
delayed: z.number(),
|
|
132
|
+
failed: z.number(),
|
|
133
|
+
completed: z.number(),
|
|
137
134
|
}),
|
|
138
|
-
500:
|
|
135
|
+
500: fieldMonitoringErrorResponseSchema,
|
|
139
136
|
},
|
|
140
137
|
summary: 'Get queue statistics',
|
|
141
138
|
},
|
|
@@ -144,35 +141,35 @@ exports.fieldMonitoringRouter = c.router({
|
|
|
144
141
|
method: 'GET',
|
|
145
142
|
path: '/farms/:farmId/fields/:fieldId/monitoring/soil/current',
|
|
146
143
|
responses: {
|
|
147
|
-
200:
|
|
148
|
-
404:
|
|
144
|
+
200: soilReadingSchema.nullable(),
|
|
145
|
+
404: fieldMonitoringErrorResponseSchema,
|
|
149
146
|
},
|
|
150
147
|
summary: 'Get current soil moisture and temperature',
|
|
151
148
|
},
|
|
152
149
|
getSoilHistory: {
|
|
153
150
|
method: 'GET',
|
|
154
151
|
path: '/farms/:farmId/fields/:fieldId/monitoring/soil/history',
|
|
155
|
-
query:
|
|
156
|
-
startDate:
|
|
157
|
-
endDate:
|
|
152
|
+
query: z.object({
|
|
153
|
+
startDate: z.string().datetime(),
|
|
154
|
+
endDate: z.string().datetime(),
|
|
158
155
|
}),
|
|
159
156
|
responses: {
|
|
160
|
-
200:
|
|
157
|
+
200: z.array(soilReadingSchema),
|
|
161
158
|
},
|
|
162
159
|
summary: 'Get historical soil readings',
|
|
163
160
|
},
|
|
164
161
|
getSoilTrend: {
|
|
165
162
|
method: 'GET',
|
|
166
163
|
path: '/farms/:farmId/fields/:fieldId/monitoring/soil/trend',
|
|
167
|
-
query:
|
|
168
|
-
days:
|
|
164
|
+
query: z.object({
|
|
165
|
+
days: z
|
|
169
166
|
.string()
|
|
170
167
|
.transform(Number)
|
|
171
|
-
.pipe(
|
|
168
|
+
.pipe(z.number().min(1).max(90))
|
|
172
169
|
.optional(),
|
|
173
170
|
}),
|
|
174
171
|
responses: {
|
|
175
|
-
200:
|
|
172
|
+
200: soilTrendSchema,
|
|
176
173
|
},
|
|
177
174
|
summary: 'Get soil moisture trend analysis',
|
|
178
175
|
},
|
|
@@ -180,26 +177,26 @@ exports.fieldMonitoringRouter = c.router({
|
|
|
180
177
|
getNDVIHistorical: {
|
|
181
178
|
method: 'GET',
|
|
182
179
|
path: '/farms/:farmId/fields/:fieldId/monitoring/ndvi/historical',
|
|
183
|
-
query:
|
|
184
|
-
startDate:
|
|
185
|
-
endDate:
|
|
186
|
-
source:
|
|
180
|
+
query: z.object({
|
|
181
|
+
startDate: z.string().datetime(),
|
|
182
|
+
endDate: z.string().datetime(),
|
|
183
|
+
source: z
|
|
187
184
|
.enum(['sentinel-2', 'landsat-8', 'modis', 'all'])
|
|
188
185
|
.optional(),
|
|
189
|
-
cloudMax:
|
|
186
|
+
cloudMax: z
|
|
190
187
|
.string()
|
|
191
188
|
.transform(Number)
|
|
192
|
-
.pipe(
|
|
189
|
+
.pipe(z.number().min(0).max(100))
|
|
193
190
|
.optional(),
|
|
194
|
-
coverageMin:
|
|
191
|
+
coverageMin: z
|
|
195
192
|
.string()
|
|
196
193
|
.transform(Number)
|
|
197
|
-
.pipe(
|
|
194
|
+
.pipe(z.number().min(0).max(100))
|
|
198
195
|
.optional(),
|
|
199
196
|
}),
|
|
200
197
|
responses: {
|
|
201
|
-
200:
|
|
202
|
-
404:
|
|
198
|
+
200: z.array(historicalNDVIDataPointSchema),
|
|
199
|
+
404: fieldMonitoringErrorResponseSchema,
|
|
203
200
|
},
|
|
204
201
|
summary: 'Get historical NDVI data (long-term trends)',
|
|
205
202
|
},
|
|
@@ -208,9 +205,9 @@ exports.fieldMonitoringRouter = c.router({
|
|
|
208
205
|
method: 'GET',
|
|
209
206
|
path: '/farms/:farmId/fields/:fieldId/monitoring/soil/profile/intelligent',
|
|
210
207
|
responses: {
|
|
211
|
-
200:
|
|
212
|
-
404:
|
|
213
|
-
400:
|
|
208
|
+
200: intelligentSoilProfileSchema,
|
|
209
|
+
404: fieldMonitoringErrorResponseSchema,
|
|
210
|
+
400: fieldMonitoringErrorResponseSchema,
|
|
214
211
|
},
|
|
215
212
|
summary: 'Get intelligent unified soil profile aggregating all data sources with LLM-powered recommendations',
|
|
216
213
|
},
|