@deepintel-ltd/buildlink-api-contracts 0.2.23

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.
Files changed (278) hide show
  1. package/README.md +27 -0
  2. package/contracts/auth.d.ts +3641 -0
  3. package/contracts/auth.d.ts.map +1 -0
  4. package/contracts/auth.js +266 -0
  5. package/contracts/auth.js.map +1 -0
  6. package/contracts/billing.d.ts +2167 -0
  7. package/contracts/billing.d.ts.map +1 -0
  8. package/contracts/billing.js +55 -0
  9. package/contracts/billing.js.map +1 -0
  10. package/contracts/boq.d.ts +1214 -0
  11. package/contracts/boq.d.ts.map +1 -0
  12. package/contracts/boq.js +31 -0
  13. package/contracts/boq.js.map +1 -0
  14. package/contracts/budget.d.ts +10677 -0
  15. package/contracts/budget.d.ts.map +1 -0
  16. package/contracts/budget.js +599 -0
  17. package/contracts/budget.js.map +1 -0
  18. package/contracts/commercial.d.ts +1475 -0
  19. package/contracts/commercial.d.ts.map +1 -0
  20. package/contracts/commercial.js +40 -0
  21. package/contracts/commercial.js.map +1 -0
  22. package/contracts/communication.d.ts +5389 -0
  23. package/contracts/communication.d.ts.map +1 -0
  24. package/contracts/communication.js +255 -0
  25. package/contracts/communication.js.map +1 -0
  26. package/contracts/contractor-ledger.d.ts +1293 -0
  27. package/contracts/contractor-ledger.d.ts.map +1 -0
  28. package/contracts/contractor-ledger.js +41 -0
  29. package/contracts/contractor-ledger.js.map +1 -0
  30. package/contracts/daily-logs.d.ts +9132 -0
  31. package/contracts/daily-logs.d.ts.map +1 -0
  32. package/contracts/daily-logs.js +188 -0
  33. package/contracts/daily-logs.js.map +1 -0
  34. package/contracts/deficiencies.d.ts +11786 -0
  35. package/contracts/deficiencies.d.ts.map +1 -0
  36. package/contracts/deficiencies.js +312 -0
  37. package/contracts/deficiencies.js.map +1 -0
  38. package/contracts/directory.d.ts +3116 -0
  39. package/contracts/directory.d.ts.map +1 -0
  40. package/contracts/directory.js +117 -0
  41. package/contracts/directory.js.map +1 -0
  42. package/contracts/documents.d.ts +4944 -0
  43. package/contracts/documents.d.ts.map +1 -0
  44. package/contracts/documents.js +251 -0
  45. package/contracts/documents.js.map +1 -0
  46. package/contracts/drawings.d.ts +10552 -0
  47. package/contracts/drawings.d.ts.map +1 -0
  48. package/contracts/drawings.js +321 -0
  49. package/contracts/drawings.js.map +1 -0
  50. package/contracts/hub.d.ts +1174 -0
  51. package/contracts/hub.d.ts.map +1 -0
  52. package/contracts/hub.js +42 -0
  53. package/contracts/hub.js.map +1 -0
  54. package/contracts/index.d.ts +128 -0
  55. package/contracts/index.d.ts.map +1 -0
  56. package/contracts/index.js +119 -0
  57. package/contracts/index.js.map +1 -0
  58. package/contracts/integrations.d.ts +4163 -0
  59. package/contracts/integrations.d.ts.map +1 -0
  60. package/contracts/integrations.js +326 -0
  61. package/contracts/integrations.js.map +1 -0
  62. package/contracts/maps.d.ts +4911 -0
  63. package/contracts/maps.d.ts.map +1 -0
  64. package/contracts/maps.js +276 -0
  65. package/contracts/maps.js.map +1 -0
  66. package/contracts/meetings.d.ts +4194 -0
  67. package/contracts/meetings.d.ts.map +1 -0
  68. package/contracts/meetings.js +115 -0
  69. package/contracts/meetings.js.map +1 -0
  70. package/contracts/monitoring.d.ts +2749 -0
  71. package/contracts/monitoring.d.ts.map +1 -0
  72. package/contracts/monitoring.js +289 -0
  73. package/contracts/monitoring.js.map +1 -0
  74. package/contracts/packages.d.ts +1470 -0
  75. package/contracts/packages.d.ts.map +1 -0
  76. package/contracts/packages.js +74 -0
  77. package/contracts/packages.js.map +1 -0
  78. package/contracts/projects.d.ts +6281 -0
  79. package/contracts/projects.d.ts.map +1 -0
  80. package/contracts/projects.js +448 -0
  81. package/contracts/projects.js.map +1 -0
  82. package/contracts/proof.d.ts +962 -0
  83. package/contracts/proof.d.ts.map +1 -0
  84. package/contracts/proof.js +34 -0
  85. package/contracts/proof.js.map +1 -0
  86. package/contracts/qaqc.d.ts +1184 -0
  87. package/contracts/qaqc.d.ts.map +1 -0
  88. package/contracts/qaqc.js +35 -0
  89. package/contracts/qaqc.js.map +1 -0
  90. package/contracts/rbac.d.ts +5227 -0
  91. package/contracts/rbac.d.ts.map +1 -0
  92. package/contracts/rbac.js +357 -0
  93. package/contracts/rbac.js.map +1 -0
  94. package/contracts/reports.d.ts +8468 -0
  95. package/contracts/reports.d.ts.map +1 -0
  96. package/contracts/reports.js +377 -0
  97. package/contracts/reports.js.map +1 -0
  98. package/contracts/resources.d.ts +15870 -0
  99. package/contracts/resources.d.ts.map +1 -0
  100. package/contracts/resources.js +869 -0
  101. package/contracts/resources.js.map +1 -0
  102. package/contracts/rfi-submittal.d.ts +2545 -0
  103. package/contracts/rfi-submittal.d.ts.map +1 -0
  104. package/contracts/rfi-submittal.js +159 -0
  105. package/contracts/rfi-submittal.js.map +1 -0
  106. package/contracts/safety.d.ts +7162 -0
  107. package/contracts/safety.d.ts.map +1 -0
  108. package/contracts/safety.js +519 -0
  109. package/contracts/safety.js.map +1 -0
  110. package/contracts/schedule.d.ts +9456 -0
  111. package/contracts/schedule.d.ts.map +1 -0
  112. package/contracts/schedule.js +460 -0
  113. package/contracts/schedule.js.map +1 -0
  114. package/contracts/spec-equal.d.ts +841 -0
  115. package/contracts/spec-equal.d.ts.map +1 -0
  116. package/contracts/spec-equal.js +28 -0
  117. package/contracts/spec-equal.js.map +1 -0
  118. package/contracts/specifications.d.ts +15478 -0
  119. package/contracts/specifications.d.ts.map +1 -0
  120. package/contracts/specifications.js +521 -0
  121. package/contracts/specifications.js.map +1 -0
  122. package/contracts/tasks.d.ts +11037 -0
  123. package/contracts/tasks.d.ts.map +1 -0
  124. package/contracts/tasks.js +693 -0
  125. package/contracts/tasks.js.map +1 -0
  126. package/contracts/timecards.d.ts +3130 -0
  127. package/contracts/timecards.d.ts.map +1 -0
  128. package/contracts/timecards.js +133 -0
  129. package/contracts/timecards.js.map +1 -0
  130. package/contracts/transmittals.d.ts +3921 -0
  131. package/contracts/transmittals.d.ts.map +1 -0
  132. package/contracts/transmittals.js +156 -0
  133. package/contracts/transmittals.js.map +1 -0
  134. package/contracts/valuations.d.ts +3266 -0
  135. package/contracts/valuations.d.ts.map +1 -0
  136. package/contracts/valuations.js +116 -0
  137. package/contracts/valuations.js.map +1 -0
  138. package/package.json +216 -0
  139. package/schemas/auth.d.ts +449 -0
  140. package/schemas/auth.d.ts.map +1 -0
  141. package/schemas/auth.js +103 -0
  142. package/schemas/auth.js.map +1 -0
  143. package/schemas/billing.d.ts +710 -0
  144. package/schemas/billing.d.ts.map +1 -0
  145. package/schemas/billing.js +82 -0
  146. package/schemas/billing.js.map +1 -0
  147. package/schemas/boq.d.ts +385 -0
  148. package/schemas/boq.d.ts.map +1 -0
  149. package/schemas/boq.js +49 -0
  150. package/schemas/boq.js.map +1 -0
  151. package/schemas/budget.d.ts +737 -0
  152. package/schemas/budget.d.ts.map +1 -0
  153. package/schemas/budget.js +272 -0
  154. package/schemas/budget.js.map +1 -0
  155. package/schemas/commercial.d.ts +358 -0
  156. package/schemas/commercial.d.ts.map +1 -0
  157. package/schemas/commercial.js +36 -0
  158. package/schemas/commercial.js.map +1 -0
  159. package/schemas/common.d.ts +865 -0
  160. package/schemas/common.d.ts.map +1 -0
  161. package/schemas/common.js +193 -0
  162. package/schemas/common.js.map +1 -0
  163. package/schemas/communication.d.ts +884 -0
  164. package/schemas/communication.d.ts.map +1 -0
  165. package/schemas/communication.js +245 -0
  166. package/schemas/communication.js.map +1 -0
  167. package/schemas/contractor-ledger.d.ts +364 -0
  168. package/schemas/contractor-ledger.d.ts.map +1 -0
  169. package/schemas/contractor-ledger.js +36 -0
  170. package/schemas/contractor-ledger.js.map +1 -0
  171. package/schemas/cursor-pagination.d.ts +258 -0
  172. package/schemas/cursor-pagination.d.ts.map +1 -0
  173. package/schemas/cursor-pagination.js +84 -0
  174. package/schemas/cursor-pagination.js.map +1 -0
  175. package/schemas/daily-logs.d.ts +2339 -0
  176. package/schemas/daily-logs.d.ts.map +1 -0
  177. package/schemas/daily-logs.js +235 -0
  178. package/schemas/daily-logs.js.map +1 -0
  179. package/schemas/deficiencies.d.ts +2496 -0
  180. package/schemas/deficiencies.d.ts.map +1 -0
  181. package/schemas/deficiencies.js +338 -0
  182. package/schemas/deficiencies.js.map +1 -0
  183. package/schemas/directory.d.ts +783 -0
  184. package/schemas/directory.d.ts.map +1 -0
  185. package/schemas/directory.js +122 -0
  186. package/schemas/directory.js.map +1 -0
  187. package/schemas/documents.d.ts +202 -0
  188. package/schemas/documents.d.ts.map +1 -0
  189. package/schemas/documents.js +76 -0
  190. package/schemas/documents.js.map +1 -0
  191. package/schemas/drawings.d.ts +2042 -0
  192. package/schemas/drawings.d.ts.map +1 -0
  193. package/schemas/drawings.js +350 -0
  194. package/schemas/drawings.js.map +1 -0
  195. package/schemas/hub.d.ts +288 -0
  196. package/schemas/hub.d.ts.map +1 -0
  197. package/schemas/hub.js +32 -0
  198. package/schemas/hub.js.map +1 -0
  199. package/schemas/integrations.d.ts +508 -0
  200. package/schemas/integrations.d.ts.map +1 -0
  201. package/schemas/integrations.js +119 -0
  202. package/schemas/integrations.js.map +1 -0
  203. package/schemas/maps.d.ts +793 -0
  204. package/schemas/maps.d.ts.map +1 -0
  205. package/schemas/maps.js +118 -0
  206. package/schemas/maps.js.map +1 -0
  207. package/schemas/meetings.d.ts +888 -0
  208. package/schemas/meetings.d.ts.map +1 -0
  209. package/schemas/meetings.js +138 -0
  210. package/schemas/meetings.js.map +1 -0
  211. package/schemas/packages.d.ts +236 -0
  212. package/schemas/packages.d.ts.map +1 -0
  213. package/schemas/packages.js +53 -0
  214. package/schemas/packages.js.map +1 -0
  215. package/schemas/projects.d.ts +306 -0
  216. package/schemas/projects.d.ts.map +1 -0
  217. package/schemas/projects.js +92 -0
  218. package/schemas/projects.js.map +1 -0
  219. package/schemas/proof.d.ts +210 -0
  220. package/schemas/proof.d.ts.map +1 -0
  221. package/schemas/proof.js +26 -0
  222. package/schemas/proof.js.map +1 -0
  223. package/schemas/qaqc.d.ts +235 -0
  224. package/schemas/qaqc.d.ts.map +1 -0
  225. package/schemas/qaqc.js +47 -0
  226. package/schemas/qaqc.js.map +1 -0
  227. package/schemas/rbac.d.ts +730 -0
  228. package/schemas/rbac.d.ts.map +1 -0
  229. package/schemas/rbac.js +230 -0
  230. package/schemas/rbac.js.map +1 -0
  231. package/schemas/reports.d.ts +5729 -0
  232. package/schemas/reports.d.ts.map +1 -0
  233. package/schemas/reports.js +589 -0
  234. package/schemas/reports.js.map +1 -0
  235. package/schemas/resources.d.ts +5190 -0
  236. package/schemas/resources.d.ts.map +1 -0
  237. package/schemas/resources.js +678 -0
  238. package/schemas/resources.js.map +1 -0
  239. package/schemas/rfi.d.ts +877 -0
  240. package/schemas/rfi.d.ts.map +1 -0
  241. package/schemas/rfi.js +84 -0
  242. package/schemas/rfi.js.map +1 -0
  243. package/schemas/safety.d.ts +1080 -0
  244. package/schemas/safety.d.ts.map +1 -0
  245. package/schemas/safety.js +237 -0
  246. package/schemas/safety.js.map +1 -0
  247. package/schemas/schedule.d.ts +4657 -0
  248. package/schemas/schedule.d.ts.map +1 -0
  249. package/schemas/schedule.js +441 -0
  250. package/schemas/schedule.js.map +1 -0
  251. package/schemas/spec-equal.d.ts +162 -0
  252. package/schemas/spec-equal.d.ts.map +1 -0
  253. package/schemas/spec-equal.js +29 -0
  254. package/schemas/spec-equal.js.map +1 -0
  255. package/schemas/specifications.d.ts +5241 -0
  256. package/schemas/specifications.d.ts.map +1 -0
  257. package/schemas/specifications.js +426 -0
  258. package/schemas/specifications.js.map +1 -0
  259. package/schemas/submittal.d.ts +867 -0
  260. package/schemas/submittal.d.ts.map +1 -0
  261. package/schemas/submittal.js +87 -0
  262. package/schemas/submittal.js.map +1 -0
  263. package/schemas/tasks.d.ts +610 -0
  264. package/schemas/tasks.d.ts.map +1 -0
  265. package/schemas/tasks.js +133 -0
  266. package/schemas/tasks.js.map +1 -0
  267. package/schemas/timecards.d.ts +618 -0
  268. package/schemas/timecards.d.ts.map +1 -0
  269. package/schemas/timecards.js +80 -0
  270. package/schemas/timecards.js.map +1 -0
  271. package/schemas/transmittals.d.ts +662 -0
  272. package/schemas/transmittals.d.ts.map +1 -0
  273. package/schemas/transmittals.js +132 -0
  274. package/schemas/transmittals.js.map +1 -0
  275. package/schemas/valuations.d.ts +713 -0
  276. package/schemas/valuations.d.ts.map +1 -0
  277. package/schemas/valuations.js +116 -0
  278. package/schemas/valuations.js.map +1 -0
@@ -0,0 +1,693 @@
1
+ import { initContract } from '@ts-rest/core';
2
+ import { z } from 'zod';
3
+ import { CuidSchema, DocumentTypeSchema, JsonApiCollectionResponseSchema, JsonApiErrorResponseSchema, JsonApiResponseSchema, TaskStatusSchema, } from '../schemas/common';
4
+ import { CreateDocumentRequestSchema, DocumentSchema, UpdateDocumentRequestSchema, } from '../schemas/documents';
5
+ import { CreateMilestoneRequestSchema, CreateTaskRequestSchema, CreateTimeEntryRequestSchema, MilestoneSchema, ProjectScheduleSchema, TaskFiltersSchema, TaskSchema, TimeEntrySchema, UpdateMilestoneRequestSchema, UpdateTaskRequestSchema, } from '../schemas/tasks';
6
+ export const CreateTaskDocumentRequestSchema = CreateDocumentRequestSchema.extend({
7
+ category: z.enum(['PROGRESS', 'ISSUE', 'COMPLETION', 'GENERAL']).optional(),
8
+ metadata: z
9
+ .object({
10
+ location: z
11
+ .object({
12
+ latitude: z.number().optional(),
13
+ longitude: z.number().optional(),
14
+ address: z.string().optional(),
15
+ })
16
+ .optional(),
17
+ timestamp: z.string().datetime().optional(),
18
+ deviceInfo: z.string().optional(),
19
+ })
20
+ .optional(),
21
+ });
22
+ export const UpdateTaskDocumentRequestSchema = UpdateDocumentRequestSchema.extend({
23
+ metadata: z
24
+ .object({
25
+ location: z
26
+ .object({
27
+ latitude: z.number().optional(),
28
+ longitude: z.number().optional(),
29
+ address: z.string().optional(),
30
+ })
31
+ .optional(),
32
+ timestamp: z.string().datetime().optional(),
33
+ })
34
+ .optional(),
35
+ });
36
+ // Create JSON:API resource schemas for task entities
37
+ const TaskResourceSchema = z.object({
38
+ type: z.literal('tasks'),
39
+ id: z.string(),
40
+ attributes: TaskSchema,
41
+ });
42
+ const TaskDocumentResourceSchema = z.object({
43
+ type: z.literal('task-documents'),
44
+ id: z.string(),
45
+ attributes: DocumentSchema,
46
+ });
47
+ const MilestoneResourceSchema = z.object({
48
+ type: z.literal('milestones'),
49
+ id: z.string(),
50
+ attributes: MilestoneSchema,
51
+ });
52
+ const ScheduleResourceSchema = z.object({
53
+ type: z.literal('project-schedules'),
54
+ id: z.string(),
55
+ attributes: ProjectScheduleSchema,
56
+ });
57
+ const TimeEntryResourceSchema = z.object({
58
+ type: z.literal('time-entries'),
59
+ id: z.string(),
60
+ attributes: TimeEntrySchema,
61
+ });
62
+ // Additional request schemas not in main schemas file
63
+ const TaskStatusRequestSchema = z.object({
64
+ status: TaskStatusSchema,
65
+ notes: z.string().optional(),
66
+ });
67
+ const TaskAssignmentRequestSchema = z.object({
68
+ assignedTo: z.array(CuidSchema),
69
+ notes: z.string().optional(),
70
+ });
71
+ const TaskBulkUpdateRequestSchema = z.object({
72
+ taskIds: z.array(CuidSchema),
73
+ updates: z.object({
74
+ status: TaskStatusSchema.optional(),
75
+ priority: z.enum(['LOW', 'MEDIUM', 'HIGH', 'CRITICAL']).optional(),
76
+ assignedTo: z.array(CuidSchema).optional(),
77
+ dueDate: z.string().datetime().optional(),
78
+ }),
79
+ });
80
+ const TaskDependencyRequestSchema = z.object({
81
+ dependsOnTaskId: CuidSchema,
82
+ dependencyType: z
83
+ .enum(['FINISH_TO_START', 'START_TO_START', 'FINISH_TO_FINISH'])
84
+ .default('FINISH_TO_START'),
85
+ });
86
+ const UpdateTimeEntryRequestSchema = z.object({
87
+ hoursWorked: z
88
+ .number()
89
+ .min(1 / 60)
90
+ .max(24 * 7)
91
+ .optional(),
92
+ description: z.string().max(500).optional(),
93
+ startTime: z.string().datetime().optional(),
94
+ endTime: z.string().datetime().optional(),
95
+ });
96
+ const TimeEntryFiltersSchema = z.object({
97
+ userId: CuidSchema.optional(),
98
+ startDate: z.string().datetime().optional(),
99
+ endDate: z.string().datetime().optional(),
100
+ taskId: CuidSchema.optional(),
101
+ });
102
+ // Common query parameters for tasks
103
+ const TaskQueryParamsSchema = z.object({
104
+ page: z.coerce.number().min(1).default(1),
105
+ limit: z.coerce.number().min(1).max(100).default(20),
106
+ companyId: CuidSchema.optional(), // For super admin override
107
+ });
108
+ const c = initContract();
109
+ export const tasksContract = c.router({
110
+ // ===== TASK MANAGEMENT =====
111
+ getTasks: {
112
+ method: 'GET',
113
+ path: '/projects/:projectId/tasks',
114
+ pathParams: z.object({
115
+ projectId: CuidSchema,
116
+ }),
117
+ responses: {
118
+ 200: JsonApiCollectionResponseSchema(TaskResourceSchema),
119
+ 401: JsonApiErrorResponseSchema,
120
+ 403: JsonApiErrorResponseSchema,
121
+ 404: JsonApiErrorResponseSchema,
122
+ },
123
+ query: TaskQueryParamsSchema.extend(TaskFiltersSchema.shape),
124
+ summary: 'Get all tasks for a project with filtering and pagination',
125
+ },
126
+ createTask: {
127
+ method: 'POST',
128
+ path: '/projects/:projectId/tasks',
129
+ pathParams: z.object({
130
+ projectId: CuidSchema,
131
+ }),
132
+ query: z.object({
133
+ companyId: CuidSchema.optional(), // For super admin override
134
+ }),
135
+ responses: {
136
+ 201: JsonApiResponseSchema(TaskResourceSchema),
137
+ 400: JsonApiErrorResponseSchema,
138
+ 401: JsonApiErrorResponseSchema,
139
+ 403: JsonApiErrorResponseSchema,
140
+ 404: JsonApiErrorResponseSchema,
141
+ },
142
+ body: CreateTaskRequestSchema,
143
+ summary: 'Create a new task in a project',
144
+ },
145
+ getTask: {
146
+ method: 'GET',
147
+ path: '/tasks/:taskId',
148
+ pathParams: z.object({
149
+ taskId: CuidSchema,
150
+ }),
151
+ query: z.object({
152
+ companyId: CuidSchema.optional(), // For super admin override
153
+ }),
154
+ responses: {
155
+ 200: JsonApiResponseSchema(TaskResourceSchema),
156
+ 401: JsonApiErrorResponseSchema,
157
+ 403: JsonApiErrorResponseSchema,
158
+ 404: JsonApiErrorResponseSchema,
159
+ },
160
+ summary: 'Get a specific task by ID',
161
+ },
162
+ updateTask: {
163
+ method: 'PUT',
164
+ path: '/tasks/:taskId',
165
+ pathParams: z.object({
166
+ taskId: CuidSchema,
167
+ }),
168
+ query: z.object({
169
+ companyId: CuidSchema.optional(), // For super admin override
170
+ }),
171
+ responses: {
172
+ 200: JsonApiResponseSchema(TaskResourceSchema),
173
+ 400: JsonApiErrorResponseSchema,
174
+ 401: JsonApiErrorResponseSchema,
175
+ 403: JsonApiErrorResponseSchema,
176
+ 404: JsonApiErrorResponseSchema,
177
+ },
178
+ body: UpdateTaskRequestSchema,
179
+ summary: 'Update an existing task',
180
+ },
181
+ deleteTask: {
182
+ method: 'DELETE',
183
+ path: '/tasks/:taskId',
184
+ pathParams: z.object({
185
+ taskId: CuidSchema,
186
+ }),
187
+ query: z.object({
188
+ companyId: CuidSchema.optional(), // For super admin override
189
+ }),
190
+ responses: {
191
+ 204: z.object({}),
192
+ 401: JsonApiErrorResponseSchema,
193
+ 403: JsonApiErrorResponseSchema,
194
+ 404: JsonApiErrorResponseSchema,
195
+ },
196
+ summary: 'Delete a task',
197
+ },
198
+ // ===== MILESTONE MANAGEMENT =====
199
+ getMilestones: {
200
+ method: 'GET',
201
+ path: '/projects/:projectId/milestones',
202
+ pathParams: z.object({
203
+ projectId: CuidSchema,
204
+ }),
205
+ responses: {
206
+ 200: JsonApiCollectionResponseSchema(MilestoneResourceSchema),
207
+ 401: JsonApiErrorResponseSchema,
208
+ 403: JsonApiErrorResponseSchema,
209
+ 404: JsonApiErrorResponseSchema,
210
+ },
211
+ query: TaskQueryParamsSchema.extend({
212
+ status: z.enum(['PLANNED', 'IN_PROGRESS', 'COMPLETED', 'DELAYED']).optional(),
213
+ dueDate: z.string().datetime().optional(),
214
+ }),
215
+ summary: 'Get all milestones for a project',
216
+ },
217
+ createMilestone: {
218
+ method: 'POST',
219
+ path: '/projects/:projectId/milestones',
220
+ pathParams: z.object({
221
+ projectId: CuidSchema,
222
+ }),
223
+ query: z.object({
224
+ companyId: CuidSchema.optional(), // For super admin override
225
+ }),
226
+ responses: {
227
+ 201: JsonApiResponseSchema(MilestoneResourceSchema),
228
+ 400: JsonApiErrorResponseSchema,
229
+ 401: JsonApiErrorResponseSchema,
230
+ 403: JsonApiErrorResponseSchema,
231
+ 404: JsonApiErrorResponseSchema,
232
+ },
233
+ body: CreateMilestoneRequestSchema,
234
+ summary: 'Create a new milestone',
235
+ },
236
+ getMilestone: {
237
+ method: 'GET',
238
+ path: '/milestones/:milestoneId',
239
+ pathParams: z.object({
240
+ milestoneId: CuidSchema,
241
+ }),
242
+ query: z.object({
243
+ companyId: CuidSchema.optional(), // For super admin override
244
+ }),
245
+ responses: {
246
+ 200: JsonApiResponseSchema(MilestoneResourceSchema),
247
+ 401: JsonApiErrorResponseSchema,
248
+ 403: JsonApiErrorResponseSchema,
249
+ 404: JsonApiErrorResponseSchema,
250
+ },
251
+ summary: 'Get a specific milestone by ID',
252
+ },
253
+ updateMilestone: {
254
+ method: 'PUT',
255
+ path: '/milestones/:milestoneId',
256
+ pathParams: z.object({
257
+ milestoneId: CuidSchema,
258
+ }),
259
+ query: z.object({
260
+ companyId: CuidSchema.optional(), // For super admin override
261
+ }),
262
+ responses: {
263
+ 200: JsonApiResponseSchema(MilestoneResourceSchema),
264
+ 400: JsonApiErrorResponseSchema,
265
+ 401: JsonApiErrorResponseSchema,
266
+ 403: JsonApiErrorResponseSchema,
267
+ 404: JsonApiErrorResponseSchema,
268
+ },
269
+ body: UpdateMilestoneRequestSchema,
270
+ summary: 'Update an existing milestone',
271
+ },
272
+ deleteMilestone: {
273
+ method: 'DELETE',
274
+ path: '/milestones/:milestoneId',
275
+ pathParams: z.object({
276
+ milestoneId: CuidSchema,
277
+ }),
278
+ query: z.object({
279
+ companyId: CuidSchema.optional(), // For super admin override
280
+ }),
281
+ responses: {
282
+ 204: z.object({}),
283
+ 401: JsonApiErrorResponseSchema,
284
+ 403: JsonApiErrorResponseSchema,
285
+ 404: JsonApiErrorResponseSchema,
286
+ },
287
+ summary: 'Delete a milestone',
288
+ },
289
+ // ===== SCHEDULE MANAGEMENT =====
290
+ getSchedule: {
291
+ method: 'GET',
292
+ path: '/projects/:projectId/schedule',
293
+ pathParams: z.object({
294
+ projectId: CuidSchema,
295
+ }),
296
+ query: TaskQueryParamsSchema.extend({
297
+ startDate: z.string().datetime().optional(),
298
+ endDate: z.string().datetime().optional(),
299
+ }),
300
+ responses: {
301
+ 200: JsonApiResponseSchema(ScheduleResourceSchema),
302
+ 401: JsonApiErrorResponseSchema,
303
+ 403: JsonApiErrorResponseSchema,
304
+ 404: JsonApiErrorResponseSchema,
305
+ },
306
+ summary: 'Get project schedule with tasks and milestones',
307
+ },
308
+ updateSchedule: {
309
+ method: 'PUT',
310
+ path: '/projects/:projectId/schedule',
311
+ pathParams: z.object({
312
+ projectId: CuidSchema,
313
+ }),
314
+ query: z.object({
315
+ companyId: CuidSchema.optional(), // For super admin override
316
+ }),
317
+ responses: {
318
+ 200: JsonApiResponseSchema(ScheduleResourceSchema),
319
+ 400: JsonApiErrorResponseSchema,
320
+ 401: JsonApiErrorResponseSchema,
321
+ 403: JsonApiErrorResponseSchema,
322
+ 404: JsonApiErrorResponseSchema,
323
+ },
324
+ body: z.object({
325
+ tasks: z.array(z.object({
326
+ taskId: CuidSchema,
327
+ startDate: z.string().datetime().optional(),
328
+ endDate: z.string().datetime().optional(),
329
+ duration: z.number().optional(),
330
+ dependencies: z.array(CuidSchema).optional(),
331
+ })),
332
+ }),
333
+ summary: 'Update project schedule',
334
+ },
335
+ // ===== TASK STATUS & ASSIGNMENT =====
336
+ updateTaskStatus: {
337
+ method: 'PATCH',
338
+ path: '/tasks/:taskId/status',
339
+ pathParams: z.object({
340
+ taskId: CuidSchema,
341
+ }),
342
+ query: z.object({
343
+ companyId: CuidSchema.optional(), // For super admin override
344
+ }),
345
+ responses: {
346
+ 200: JsonApiResponseSchema(TaskResourceSchema),
347
+ 400: JsonApiErrorResponseSchema,
348
+ 401: JsonApiErrorResponseSchema,
349
+ 403: JsonApiErrorResponseSchema,
350
+ 404: JsonApiErrorResponseSchema,
351
+ },
352
+ body: TaskStatusRequestSchema,
353
+ summary: 'Update task status',
354
+ },
355
+ assignTask: {
356
+ method: 'PATCH',
357
+ path: '/tasks/:taskId/assign',
358
+ pathParams: z.object({
359
+ taskId: CuidSchema,
360
+ }),
361
+ query: z.object({
362
+ companyId: CuidSchema.optional(), // For super admin override
363
+ }),
364
+ responses: {
365
+ 200: JsonApiResponseSchema(TaskResourceSchema),
366
+ 400: JsonApiErrorResponseSchema,
367
+ 401: JsonApiErrorResponseSchema,
368
+ 403: JsonApiErrorResponseSchema,
369
+ 404: JsonApiErrorResponseSchema,
370
+ },
371
+ body: TaskAssignmentRequestSchema,
372
+ summary: 'Assign or reassign a task to a user',
373
+ },
374
+ // ===== BULK OPERATIONS =====
375
+ bulkUpdateTasks: {
376
+ method: 'PATCH',
377
+ path: '/projects/:projectId/tasks/bulk',
378
+ pathParams: z.object({
379
+ projectId: CuidSchema,
380
+ }),
381
+ query: z.object({
382
+ companyId: CuidSchema.optional(), // For super admin override
383
+ }),
384
+ responses: {
385
+ 200: JsonApiResponseSchema(z.object({
386
+ type: z.literal('bulk-operations'),
387
+ id: z.string(),
388
+ attributes: z.object({
389
+ updatedTaskIds: z.array(CuidSchema),
390
+ updatedCount: z.number(),
391
+ failedUpdates: z.array(z.object({
392
+ taskId: CuidSchema,
393
+ error: z.string(),
394
+ })),
395
+ }),
396
+ })),
397
+ 400: JsonApiErrorResponseSchema,
398
+ 401: JsonApiErrorResponseSchema,
399
+ 403: JsonApiErrorResponseSchema,
400
+ 404: JsonApiErrorResponseSchema,
401
+ },
402
+ body: TaskBulkUpdateRequestSchema,
403
+ summary: 'Bulk update multiple tasks',
404
+ },
405
+ // ===== TASK DEPENDENCIES =====
406
+ addTaskDependency: {
407
+ method: 'POST',
408
+ path: '/tasks/:taskId/dependencies',
409
+ pathParams: z.object({
410
+ taskId: CuidSchema,
411
+ }),
412
+ query: z.object({
413
+ companyId: CuidSchema.optional(), // For super admin override
414
+ }),
415
+ responses: {
416
+ 201: JsonApiResponseSchema(z.object({
417
+ type: z.literal('task-dependencies'),
418
+ id: z.string(),
419
+ attributes: z.object({
420
+ taskId: CuidSchema,
421
+ dependsOnTaskId: CuidSchema,
422
+ dependencyType: z.enum(['FINISH_TO_START', 'START_TO_START', 'FINISH_TO_FINISH']),
423
+ createdAt: z.string().datetime(),
424
+ }),
425
+ })),
426
+ 400: JsonApiErrorResponseSchema,
427
+ 401: JsonApiErrorResponseSchema,
428
+ 403: JsonApiErrorResponseSchema,
429
+ 404: JsonApiErrorResponseSchema,
430
+ 409: JsonApiErrorResponseSchema, // Circular dependency
431
+ },
432
+ body: TaskDependencyRequestSchema,
433
+ summary: 'Add a dependency between tasks',
434
+ },
435
+ removeTaskDependency: {
436
+ method: 'DELETE',
437
+ path: '/tasks/:taskId/dependencies/:dependencyId',
438
+ pathParams: z.object({
439
+ taskId: CuidSchema,
440
+ dependencyId: CuidSchema,
441
+ }),
442
+ query: z.object({
443
+ companyId: CuidSchema.optional(), // For super admin override
444
+ }),
445
+ responses: {
446
+ 204: z.object({}),
447
+ 401: JsonApiErrorResponseSchema,
448
+ 403: JsonApiErrorResponseSchema,
449
+ 404: JsonApiErrorResponseSchema,
450
+ },
451
+ summary: 'Remove a task dependency',
452
+ },
453
+ // ===== TIME TRACKING =====
454
+ createTimeEntry: {
455
+ method: 'POST',
456
+ path: '/tasks/:taskId/time-entries',
457
+ pathParams: z.object({
458
+ taskId: CuidSchema,
459
+ }),
460
+ query: z.object({
461
+ companyId: CuidSchema.optional(), // For super admin override
462
+ }),
463
+ responses: {
464
+ 201: JsonApiResponseSchema(TimeEntryResourceSchema),
465
+ 400: JsonApiErrorResponseSchema,
466
+ 401: JsonApiErrorResponseSchema,
467
+ 403: JsonApiErrorResponseSchema,
468
+ 404: JsonApiErrorResponseSchema,
469
+ },
470
+ body: CreateTimeEntryRequestSchema,
471
+ summary: 'Log time entry for a task',
472
+ },
473
+ getTimeEntries: {
474
+ method: 'GET',
475
+ path: '/tasks/:taskId/time-entries',
476
+ pathParams: z.object({
477
+ taskId: CuidSchema,
478
+ }),
479
+ responses: {
480
+ 200: JsonApiCollectionResponseSchema(TimeEntryResourceSchema),
481
+ 401: JsonApiErrorResponseSchema,
482
+ 403: JsonApiErrorResponseSchema,
483
+ 404: JsonApiErrorResponseSchema,
484
+ },
485
+ query: TaskQueryParamsSchema.extend(TimeEntryFiltersSchema.shape),
486
+ summary: 'Get time entries for a specific task',
487
+ },
488
+ updateTimeEntry: {
489
+ method: 'PUT',
490
+ path: '/time-entries/:timeEntryId',
491
+ pathParams: z.object({
492
+ timeEntryId: CuidSchema,
493
+ }),
494
+ query: z.object({
495
+ companyId: CuidSchema.optional(), // For super admin override
496
+ }),
497
+ responses: {
498
+ 200: JsonApiResponseSchema(TimeEntryResourceSchema),
499
+ 400: JsonApiErrorResponseSchema,
500
+ 401: JsonApiErrorResponseSchema,
501
+ 403: JsonApiErrorResponseSchema,
502
+ 404: JsonApiErrorResponseSchema,
503
+ },
504
+ body: UpdateTimeEntryRequestSchema,
505
+ summary: 'Update a time entry',
506
+ },
507
+ getTimeEntry: {
508
+ method: 'GET',
509
+ path: '/time-entries/:timeEntryId',
510
+ pathParams: z.object({
511
+ timeEntryId: CuidSchema,
512
+ }),
513
+ query: z.object({
514
+ companyId: CuidSchema.optional(), // For super admin override
515
+ }),
516
+ responses: {
517
+ 200: JsonApiResponseSchema(TimeEntryResourceSchema),
518
+ 401: JsonApiErrorResponseSchema,
519
+ 403: JsonApiErrorResponseSchema,
520
+ 404: JsonApiErrorResponseSchema,
521
+ },
522
+ summary: 'Get a specific time entry by ID',
523
+ },
524
+ deleteTimeEntry: {
525
+ method: 'DELETE',
526
+ path: '/time-entries/:timeEntryId',
527
+ pathParams: z.object({
528
+ timeEntryId: CuidSchema,
529
+ }),
530
+ query: z.object({
531
+ companyId: CuidSchema.optional(), // For super admin override
532
+ }),
533
+ responses: {
534
+ 204: z.object({}),
535
+ 401: JsonApiErrorResponseSchema,
536
+ 403: JsonApiErrorResponseSchema,
537
+ 404: JsonApiErrorResponseSchema,
538
+ },
539
+ summary: 'Delete a time entry',
540
+ },
541
+ // ===== PROJECT TIME REPORTING =====
542
+ getProjectTimeEntries: {
543
+ method: 'GET',
544
+ path: '/projects/:projectId/time-entries',
545
+ pathParams: z.object({
546
+ projectId: CuidSchema,
547
+ }),
548
+ responses: {
549
+ 200: JsonApiCollectionResponseSchema(TimeEntryResourceSchema),
550
+ 401: JsonApiErrorResponseSchema,
551
+ 403: JsonApiErrorResponseSchema,
552
+ 404: JsonApiErrorResponseSchema,
553
+ },
554
+ query: TaskQueryParamsSchema.extend(TimeEntryFiltersSchema.shape),
555
+ summary: 'Get all time entries for a project',
556
+ },
557
+ // ===== TASK DOCUMENTS =====
558
+ getTaskDocuments: {
559
+ method: 'GET',
560
+ path: '/tasks/:taskId/documents',
561
+ pathParams: z.object({
562
+ taskId: CuidSchema,
563
+ }),
564
+ query: z.object({
565
+ page: z.coerce.number().min(1).default(1),
566
+ limit: z.coerce.number().min(1).max(100).default(20),
567
+ type: DocumentTypeSchema.optional(),
568
+ category: z.enum(['PROGRESS', 'ISSUE', 'COMPLETION', 'GENERAL']).optional(),
569
+ search: z.string().optional(),
570
+ tags: z.string().optional(), // comma-separated
571
+ }),
572
+ responses: {
573
+ 200: JsonApiCollectionResponseSchema(TaskDocumentResourceSchema),
574
+ 401: JsonApiErrorResponseSchema,
575
+ 403: JsonApiErrorResponseSchema,
576
+ 404: JsonApiErrorResponseSchema,
577
+ },
578
+ summary: 'Get all documents for a task',
579
+ description: 'Retrieve all documents associated with a task with optional filtering and pagination',
580
+ },
581
+ uploadTaskDocument: {
582
+ method: 'POST',
583
+ path: '/tasks/:taskId/documents',
584
+ pathParams: z.object({
585
+ taskId: CuidSchema,
586
+ }),
587
+ body: CreateTaskDocumentRequestSchema,
588
+ responses: {
589
+ 201: JsonApiResponseSchema(TaskDocumentResourceSchema),
590
+ 400: JsonApiErrorResponseSchema,
591
+ 401: JsonApiErrorResponseSchema,
592
+ 403: JsonApiErrorResponseSchema,
593
+ 404: JsonApiErrorResponseSchema,
594
+ },
595
+ summary: 'Upload document to task',
596
+ description: 'Upload a new document or photo to a task',
597
+ },
598
+ getTaskDocument: {
599
+ method: 'GET',
600
+ path: '/tasks/:taskId/documents/:documentId',
601
+ pathParams: z.object({
602
+ taskId: CuidSchema,
603
+ documentId: CuidSchema,
604
+ }),
605
+ responses: {
606
+ 200: JsonApiResponseSchema(TaskDocumentResourceSchema),
607
+ 401: JsonApiErrorResponseSchema,
608
+ 403: JsonApiErrorResponseSchema,
609
+ 404: JsonApiErrorResponseSchema,
610
+ },
611
+ summary: 'Get task document',
612
+ description: 'Get a specific document associated with a task',
613
+ },
614
+ updateTaskDocument: {
615
+ method: 'PUT',
616
+ path: '/tasks/:taskId/documents/:documentId',
617
+ pathParams: z.object({
618
+ taskId: CuidSchema,
619
+ documentId: CuidSchema,
620
+ }),
621
+ body: UpdateTaskDocumentRequestSchema,
622
+ responses: {
623
+ 200: JsonApiResponseSchema(TaskDocumentResourceSchema),
624
+ 400: JsonApiErrorResponseSchema,
625
+ 401: JsonApiErrorResponseSchema,
626
+ 403: JsonApiErrorResponseSchema,
627
+ 404: JsonApiErrorResponseSchema,
628
+ },
629
+ summary: 'Update task document',
630
+ description: 'Update metadata of a document associated with a task',
631
+ },
632
+ deleteTaskDocument: {
633
+ method: 'DELETE',
634
+ path: '/tasks/:taskId/documents/:documentId',
635
+ pathParams: z.object({
636
+ taskId: CuidSchema,
637
+ documentId: CuidSchema,
638
+ }),
639
+ responses: {
640
+ 204: z.undefined(),
641
+ 401: JsonApiErrorResponseSchema,
642
+ 403: JsonApiErrorResponseSchema,
643
+ 404: JsonApiErrorResponseSchema,
644
+ },
645
+ summary: 'Delete task document',
646
+ description: 'Remove a document from a task',
647
+ },
648
+ downloadTaskDocument: {
649
+ method: 'GET',
650
+ path: '/tasks/:taskId/documents/:documentId/download',
651
+ pathParams: z.object({
652
+ taskId: CuidSchema,
653
+ documentId: CuidSchema,
654
+ }),
655
+ responses: {
656
+ 200: z.any(),
657
+ 401: JsonApiErrorResponseSchema,
658
+ 403: JsonApiErrorResponseSchema,
659
+ 404: JsonApiErrorResponseSchema,
660
+ },
661
+ summary: 'Download task document',
662
+ description: 'Download a document associated with a task',
663
+ },
664
+ // Bulk operations for task documents
665
+ bulkDeleteTaskDocuments: {
666
+ method: 'DELETE',
667
+ path: '/tasks/:taskId/documents/bulk',
668
+ pathParams: z.object({
669
+ taskId: CuidSchema,
670
+ }),
671
+ body: z.object({
672
+ documentIds: z.array(CuidSchema).min(1).max(50),
673
+ }),
674
+ responses: {
675
+ 200: JsonApiResponseSchema(z.object({
676
+ type: z.literal('bulk-operation'),
677
+ id: z.string(),
678
+ attributes: z.object({
679
+ success: z.boolean(),
680
+ deletedCount: z.number(),
681
+ failedIds: z.array(CuidSchema),
682
+ }),
683
+ })),
684
+ 400: JsonApiErrorResponseSchema,
685
+ 401: JsonApiErrorResponseSchema,
686
+ 403: JsonApiErrorResponseSchema,
687
+ 404: JsonApiErrorResponseSchema,
688
+ },
689
+ summary: 'Bulk delete task documents',
690
+ description: 'Delete multiple documents from a task in a single operation',
691
+ },
692
+ });
693
+ //# sourceMappingURL=tasks.js.map