@deepintel-ltd/farmpro-contracts 1.5.8 → 1.5.10
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.d.ts +8 -1
- package/dist/routes/field-monitoring.routes.d.ts.map +1 -1
- package/dist/routes/field-monitoring.routes.js +77 -74
- 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.d.ts +306 -0
- package/dist/routes/team.routes.d.ts.map +1 -1
- package/dist/routes/team.routes.js +79 -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',
|
|
@@ -1252,7 +1252,14 @@ export declare const fieldMonitoringRouter: {
|
|
|
1252
1252
|
};
|
|
1253
1253
|
};
|
|
1254
1254
|
getIntelligentSoilProfile: {
|
|
1255
|
-
|
|
1255
|
+
query: z.ZodObject<{
|
|
1256
|
+
forceRefresh: z.ZodEffects<z.ZodOptional<z.ZodString>, boolean, string | undefined>;
|
|
1257
|
+
}, "strip", z.ZodTypeAny, {
|
|
1258
|
+
forceRefresh: boolean;
|
|
1259
|
+
}, {
|
|
1260
|
+
forceRefresh?: string | undefined;
|
|
1261
|
+
}>;
|
|
1262
|
+
summary: "Get intelligent unified soil profile aggregating all data sources with LLM-powered recommendations. Cached for 2 days unless forceRefresh=true";
|
|
1256
1263
|
method: "GET";
|
|
1257
1264
|
path: "/farms/:farmId/fields/:fieldId/monitoring/soil/profile/intelligent";
|
|
1258
1265
|
responses: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"field-monitoring.routes.d.ts","sourceRoot":"","sources":["../../src/routes/field-monitoring.routes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAoBxB,eAAO,MAAM,qBAAqB
|
|
1
|
+
{"version":3,"file":"field-monitoring.routes.d.ts","sourceRoot":"","sources":["../../src/routes/field-monitoring.routes.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAoBxB,eAAO,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAsOhC,CAAC;AAEH,MAAM,MAAM,qBAAqB,GAAG,OAAO,qBAAqB,CAAC"}
|
|
@@ -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
|
},
|
|
@@ -207,11 +204,17 @@ exports.fieldMonitoringRouter = c.router({
|
|
|
207
204
|
getIntelligentSoilProfile: {
|
|
208
205
|
method: 'GET',
|
|
209
206
|
path: '/farms/:farmId/fields/:fieldId/monitoring/soil/profile/intelligent',
|
|
207
|
+
query: z.object({
|
|
208
|
+
forceRefresh: z
|
|
209
|
+
.string()
|
|
210
|
+
.optional()
|
|
211
|
+
.transform((val) => val === 'true' || val === '1'),
|
|
212
|
+
}),
|
|
210
213
|
responses: {
|
|
211
|
-
200:
|
|
212
|
-
404:
|
|
213
|
-
400:
|
|
214
|
+
200: intelligentSoilProfileSchema,
|
|
215
|
+
404: fieldMonitoringErrorResponseSchema,
|
|
216
|
+
400: fieldMonitoringErrorResponseSchema,
|
|
214
217
|
},
|
|
215
|
-
summary: 'Get intelligent unified soil profile aggregating all data sources with LLM-powered recommendations',
|
|
218
|
+
summary: 'Get intelligent unified soil profile aggregating all data sources with LLM-powered recommendations. Cached for 2 days unless forceRefresh=true',
|
|
216
219
|
},
|
|
217
220
|
});
|