Skip to content

Commit c4b9efa

Browse files
Merge pull request #358 from AmericaSCORESBayArea/sandbox
Task API: Add Statuses, 404 Handling & Session Task Create/Delete
2 parents 2802609 + 4695d45 commit c4b9efa

File tree

5 files changed

+130
-31
lines changed

5 files changed

+130
-31
lines changed

docs/Scores - Salesforce Data API.postman_collection.json

Lines changed: 36 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1245,15 +1245,15 @@
12451245
],
12461246
"body": {
12471247
"mode": "raw",
1248-
"raw": "{\n \"SessionDate\": \"2025-11-19\",\n \"SessionTopic\": \"Game Day\",\n \"TeamSeasonId\": \"a0qcX000000GEggQAG\",\n \"SessionStart\": \"16:00:00.000Z\",\n \"SessionEnd\": \"18:00:00.000Z\" \n}",
1248+
"raw": "{\n \"SessionDate\": \"2025-11-19\",\n \"SessionTopic\": \"Game Day\",\n \"TeamSeasonId\": \"a0qcX000000GEggQAG\",\n \"SessionStart\": \"16:00:00.000Z\",\n \"SessionEnd\": \"18:00:00.000Z\",\n \"CoachId\": \"003UQ00000EiAy9YAF\"\n}",
12491249
"options": {
12501250
"raw": {
12511251
"language": "json"
12521252
}
12531253
}
12541254
},
12551255
"url": {
1256-
"raw": "{{base_url_s}}/sessions?createAttendances=True",
1256+
"raw": "{{base_url_s}}/sessions?createAttendanceTask=true",
12571257
"host": [
12581258
"{{base_url_s}}"
12591259
],
@@ -1262,8 +1262,8 @@
12621262
],
12631263
"query": [
12641264
{
1265-
"key": "createAttendances",
1266-
"value": "True"
1265+
"key": "createAttendanceTask",
1266+
"value": "true"
12671267
}
12681268
]
12691269
}
@@ -2404,6 +2404,38 @@
24042404
"description": "BODY/JSON:\n\n{ \n\"TeamSeasonName\": \"\", \n\"TeamId\": \"\", \n\"SeasonId\": \"\", \n\"SchoolSite\": \"\", \n\"Partnership\": \"\", \n\"TotalNoOfPlayers\": 0, \n\"TotalNoOfSessions\": 0, \n\"SeasonStartDate\": \"\", \n\"SeasonEndDate\": \"\", \n\"CoachSoccer\": \"\", \n\"CoachWriting\": \"\", \n\"ProgramCoordinator\": \"\", \n\"ProgramManager\": \"\" \n}"
24052405
},
24062406
"response": []
2407+
},
2408+
{
2409+
"name": "/tasks/statuses",
2410+
"request": {
2411+
"method": "GET",
2412+
"header": [
2413+
{
2414+
"key": "client_id",
2415+
"value": "{{sandbox_client_id}}"
2416+
},
2417+
{
2418+
"key": "client_secret",
2419+
"value": "{{sandbox_client_secret}}"
2420+
},
2421+
{
2422+
"key": "Origin",
2423+
"value": "Postman",
2424+
"type": "text"
2425+
}
2426+
],
2427+
"url": {
2428+
"raw": "{{base_url}}/tasks/statuses",
2429+
"host": [
2430+
"{{base_url}}"
2431+
],
2432+
"path": [
2433+
"tasks",
2434+
"statuses"
2435+
]
2436+
}
2437+
},
2438+
"response": []
24072439
}
24082440
]
24092441
}

src/main/mule/main-api.xml

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -177,6 +177,9 @@
177177
<set-variable value="400" doc:name="Set Status Code" doc:id="51fbd79f-5402-4a83-8ca3-b8680e3b81e0" variableName="httpStatus" />
178178
<set-variable value='#[vars.errorCustomType replace "UNKNOWN" with "MALFORMED_ID"]' doc:name="Update errorCustomType" doc:id="5049dfed-7516-4f02-b8b1-b273863b706b" variableName="errorCustomType"/>
179179
</when>
180+
<when expression='#[(vars.errorCustomType contains "NOT_FOUND")]'>
181+
<set-variable value="404" doc:name="Set Status Code" doc:id="b287636a-e58c-4f72-9bd4-311dd2428e3c" variableName="httpStatus" />
182+
</when>
180183
</choice>
181184
<ee:transform doc:name="Transform Message" doc:id="e7421cb1-862d-4dc7-bbee-e8ab29f998fe">
182185
<ee:message>

src/main/mule/sessions.xml

Lines changed: 45 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -217,9 +217,10 @@ output application/json
217217
doc:name="Log entry-flow"
218218
doc:id="eeb32be2-c86a-4bb7-a34d-7258ee797f6a"
219219
message="Method and Request Path stored as vars: method=#[vars.method], request path=#[vars.requestPath]. queryparams=#[attributes.queryParams]" />
220-
<set-variable value="#[attributes.queryParams.createAttendances as Boolean default false]" doc:name="Set CreateAttendances" doc:id="8728d853-7e61-4646-86cb-d1cfd593450a" variableName="createAttendances"/>
221220
<set-variable value="#[payload.TeamSeasonId]" doc:name="Set TeamSeasonId" doc:id="e19555a7-5f6e-4b6c-9e7c-0d66f9b6bf8f" variableName="teamSeasonId" />
222221
<set-variable value="#[payload.SessionDate]" doc:name="Set SessionDate" doc:id="d52910ea-c4e3-47b8-9b98-e043c13b4d85" variableName="sessionDate" />
222+
<set-variable value="#[payload.CoachId]" doc:name="Set Coach" doc:id="71ea2ada-69c8-4564-b64b-0ba92f60882b" variableName="coachId" />
223+
<set-variable value="#[attributes.queryParams.createAttendanceTask]" doc:name='Set Variable "createAttendanceTask"' doc:id="1b9a368e-4346-46e0-b7bc-3083b2c1a243" variableName="createAttendanceTask"/>
223224
<ee:transform
224225
doc:name="Create Request"
225226
doc:id="38bd186d-e6af-481c-9dd1-3405eba1e8d8">
@@ -249,36 +250,36 @@ output application/java
249250
</when>
250251
</choice>
251252
<set-variable value="#[payload.items[0].id]" doc:name="Set SessionId" doc:id="1bb65f85-ccb1-44dd-a649-6037aca328c7" variableName="sessionId" />
252-
<choice doc:name="Choice" doc:id="636e0665-a408-4d9e-9339-8b0345da5589" >
253-
<when expression="#[vars.createAttendances]">
254-
<flow-ref doc:name="Call `createAttendancesForSessionBasedOnTeamSeasonId`" doc:id="26220665-5702-4b5f-9199-6ed08d3c4191" name="createAttendancesForSessionBasedOnTeamSeasonId" />
255-
<ee:transform doc:name="Create Response" doc:id="a4e94cf9-897d-425c-8a69-8fea59b8728b" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd">
256-
<ee:message>
257-
<ee:set-payload><![CDATA[%dw 2.0
253+
<choice doc:name="Choice" doc:id="ad29689f-5ade-4792-a9ea-dea7eb927af2">
254+
<when expression="#[vars.coachId != null and ((vars.createAttendanceTask as Boolean) default true)]" >
255+
<set-payload value='#[%dw 2.0
258256
output application/json
259257
---
260258
{
261-
"SessionId": vars.sessionId,
262-
"Attendances": payload
263-
}
264-
]]></ee:set-payload>
265-
</ee:message>
266-
</ee:transform>
259+
"AssignedTo": vars.coachId,
260+
"CreatedByContact": vars.coachId,
261+
"DueDate": vars.sessionDate,
262+
"LastModifiedBy": vars.coachId,
263+
"OwnerId": "0051T000009eHfvQAE",
264+
"Session": vars.sessionId,
265+
"TaskType": "Take Attendance",
266+
"Name": "Take attendance " ++ (vars.sessionDate as Date) as String default ""
267+
}]' doc:name="Set Payload" doc:id="1f7ed8e0-874b-485a-b9bf-a02c35ff996a" />
268+
<flow-ref doc:name="Flow Reference" doc:id="46118eaf-9e3c-4c76-804b-4f5ace196354" name="post:\tasks:application\json:salesforce-data-api-config"/>
267269
</when>
268-
<otherwise >
269-
<ee:transform doc:name="Create Response" doc:id="bb26a451-14f2-416c-9d61-2c9e0953227d" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd" >
270+
</choice>
271+
<ee:transform doc:name="Create Response" doc:id="55d45f1a-8a01-4141-a272-b76c478eb509" xsi:schemaLocation="http://www.mulesoft.org/schema/mule/ee/core http://www.mulesoft.org/schema/mule/ee/core/current/mule-ee.xsd" >
270272
<ee:message >
271273
<ee:set-payload ><![CDATA[%dw 2.0
272274
output application/json
273275
---
274276
{
275277
"SessionId": vars.sessionId,
276-
"Attendances": []
278+
"TaskId": payload.TaskId default null,
279+
"Attendances": payload.Attendances default []
277280
}]]></ee:set-payload>
278281
</ee:message>
279282
</ee:transform>
280-
</otherwise>
281-
</choice>
282283
<logger level="INFO" doc:name="Log Created Response" doc:id="640a58eb-a8ab-40f9-bcc2-a9cadcf86bb5" message="#[payload]" />
283284
</flow>
284285
<flow name="delete:\sessions\(sessionId):salesforce-data-api-config" doc:id="d97b31a5-0ea7-46d3-a346-cbca136228e3" >
@@ -330,6 +331,17 @@ payload]">
330331
sessionId : vars.sessionId
331332
}]]]></salesforce:parameters>
332333
</salesforce:query>
334+
<salesforce:query doc:name="Select Query with sessionId from SCORES_Task Object" doc:id="d60136d3-1af9-4f3e-8d6d-55a308800149" config-ref="Salesforce_Config" target="tasksResponse" targetValue="#[output application/json
335+
---
336+
payload]">
337+
<salesforce:salesforce-query><![CDATA[SELECT Id, Session__c FROM SCORES_Task__c WHERE Session__c = ':sessionId'
338+
]]></salesforce:salesforce-query>
339+
<salesforce:parameters><![CDATA[#[output application/java
340+
---
341+
{
342+
sessionId : vars.sessionId
343+
}]]]></salesforce:parameters>
344+
</salesforce:query>
333345
<salesforce:query doc:name="Select Query with sessionId from Attendence object" doc:id="cfe08f1a-cc1a-4102-bf59-a6aaeb021ec5" config-ref="Salesforce_Config" target="attendanceResponse" targetValue="#[output application/json
334346
---
335347
payload]">
@@ -343,24 +355,31 @@ payload]">
343355
</salesforce:query>
344356
<set-variable value='#[%dw 2.0
345357
output application/json
358+
---
359+
{
360+
ids: vars.tasksResponse map (item, itemIndex) -&gt; (item.Id) default [],
361+
}]' doc:name="Set Tasks Ids" doc:id="63c78d85-abc5-4fe8-8dbf-d900258c9935" variableName="tasksResponsePrepared" />
362+
<set-variable value='#[%dw 2.0
363+
output application/json
346364
var attendedTrue = vars.attendanceResponse filter (item, itemIndex) -&gt; (item.Attended__c == "true")
347365
---
348366
{
349367
toRemove: isEmpty(attendedTrue),
350-
ids: vars.attendanceResponse map (item, itemIndex) -&gt; (item.Id),
351-
idsTrue: attendedTrue map (item, itemIndex) -&gt; (item.Id)
368+
ids: vars.attendanceResponse map (item, itemIndex) -&gt; (item.Id) default [],
369+
idsTrue: attendedTrue map (item, itemIndex) -&gt; (item.Id) default []
352370
}]' doc:name="Set Attendances `toRemove` and `Ids`" doc:id="803dbfac-430e-491a-9576-ba7644ba9ccd" variableName="attendanceResponsePrepared"/>
353371
<choice doc:name="Choice" doc:id="92f74e31-c84b-4d92-96a8-a54282a8f912">
354372
<when expression="#[isEmpty(vars.assesmentResponse) and vars.attendanceResponsePrepared.toRemove]">
355-
<ee:transform doc:name="sessionIds" doc:id="0fbc4a8b-63a7-4921-a442-cb27583294c7">
373+
<ee:transform doc:name="tasksIds + attendancesIds + sessionId" doc:id="0fbc4a8b-63a7-4921-a442-cb27583294c7">
356374
<ee:message>
357375
<ee:set-payload><![CDATA[%dw 2.0
358376
output application/java
359377
---
360-
vars.attendanceResponsePrepared.ids + vars.sessionId]]></ee:set-payload>
378+
vars.tasksResponsePrepared.ids ++ vars.attendanceResponsePrepared.ids + vars.sessionId]]></ee:set-payload>
361379
</ee:message>
362380
</ee:transform>
363-
<salesforce:delete doc:name="Delete" doc:id="6f2a821e-2e0f-416d-a109-983073873bba" config-ref="Salesforce_Config" />
381+
<salesforce:delete doc:name="Delete All" doc:id="6f2a821e-2e0f-416d-a109-983073873bba" config-ref="Salesforce_Config">
382+
</salesforce:delete>
364383
<ee:transform doc:name="Transform Message" doc:id="903290a7-d881-491c-801e-80979a824387">
365384
<ee:message>
366385
<ee:set-payload><![CDATA[%dw 2.0
@@ -382,9 +401,10 @@ payload]]></ee:set-payload>
382401
output application/json
383402
---
384403
{
385-
"message" : "Session and related attendances are deleted successfully",
404+
"message" : "Session, related attendances and tasks are deleted successfully",
386405
"sessionId": vars.sessionId,
387406
"attendenceIds": vars.attendanceResponsePrepared.ids,
407+
"taskIds": vars.tasksResponsePrepared.ids,
388408
"success": true
389409
}]]></ee:set-payload>
390410
</ee:message>
@@ -400,7 +420,7 @@ output application/json
400420
output application/json
401421
---
402422
{
403-
"message" : "There are students attended this session, therefore the session is active and cannot be removed",
423+
"message" : "There are students attended this session OR there are associated assessment responses, therefore the session is active and cannot be removed",
404424
"assessmentIds": vars.assesmentResponse,
405425
"attendenceIds": vars.attendanceResponsePrepared.idsTrue,
406426
"success": false

src/main/mule/tasks.xml

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -162,6 +162,13 @@ output application/json
162162
vars.task]]></ee:set-payload>
163163
</ee:message>
164164
</ee:transform>
165+
<choice doc:name="Choice" doc:id="1f06c664-36f2-43b1-a079-2eead1f7661b" >
166+
<when expression="#[vars.task == null]">
167+
<set-variable value="#['SALESFORCE_TASK_GET:NOT_FOUND']" doc:name="Set Custom Error Type" doc:id="bfbf2580-ded4-40b2-b4a6-13cd9aba7395" variableName="errorCustomType" />
168+
<set-variable value="The task with the given ID does not exist." doc:name="Set Custom Error Message" doc:id="68a345db-1898-4a73-bf7f-90cd763f2c2e" variableName="errorCustomMessage" />
169+
<raise-error doc:name="Raise error" doc:id="917b410d-1572-47d4-ab06-e7e3525a7f2b" type="CUSTOM:CUSTOM_ERROR" description="Something went wrong while retrieving the task record." />
170+
</when>
171+
</choice>
165172
<choice doc:name="Do we retrieve attendances?" doc:id="c3f4c5d9-605f-443c-a94e-ec85c809b45c" doc:description='When session is empty, but task type is "Take Attendance", we throw an error.' >
166173
<when expression='#[vars.task.TaskType == "Take Attendance"]' >
167174
<set-variable value="#[vars.task.Session]" doc:name="Set sessionId" doc:id="ca8c94e6-3b56-4e41-b929-64629b707e03" variableName="sessionId" />
@@ -189,7 +196,7 @@ vars.task]]></ee:set-payload>
189196
<when expression="#[isEmpty(vars.sessionDate)]" >
190197
<set-variable value="#['SALESFORCE_TASK_GET:BAD_REQUEST']" doc:name="Set Custom Error Type" doc:id="14384c39-deb4-4f66-b847-04b61e455036" variableName="errorCustomType" />
191198
<set-variable value="The given session doesn’t have a date or does not exist. Cannot proceed with creating a task and attendance records." doc:name="Set Custom Error Message" doc:id="d3132527-7cda-480d-b28d-3aa2fe12c502" variableName="errorCustomMessage" />
192-
<raise-error doc:name="Raise error" doc:id="fe77e915-6316-4296-bf94-dfb8b47eb37b" type="CUSTOM:CUSTOM_ERROR" description="Something went wrong while creating a task record." />
199+
<raise-error doc:name="Raise error" doc:id="fe77e915-6316-4296-bf94-dfb8b47eb37b" type="CUSTOM:CUSTOM_ERROR" description="Something went wrong while retrieving the task record." />
193200
</when>
194201
</choice>
195202
<flow-ref doc:name="Call `createAttendancesForSessionBasedOnTeamSeasonId`" doc:id="698c33b1-167a-446d-9db8-beac679f1b71" name="createAttendancesForSessionBasedOnTeamSeasonId" />
@@ -567,4 +574,19 @@ output application/json
567574
</otherwise>
568575
</choice>
569576
</flow>
577+
<flow name="get:\tasks\statuses:salesforce-data-api-config" doc:id="3988c28e-09bb-40db-a39e-b1524d410a3d" >
578+
<salesforce:describe-sobject doc:name="Describe sobject" doc:id="8d649a07-4555-4fb6-a044-bb90dd7fc44e" config-ref="Salesforce_Config" type="SCORES_Task__c"/>
579+
<ee:transform doc:name="Transform Message" doc:id="270568a7-7791-4198-ab7e-30342c2b23b6" >
580+
<ee:message >
581+
<ee:set-payload ><![CDATA[%dw 2.0
582+
output application/json
583+
---
584+
(
585+
payload.fields
586+
filter (field) -> field.name == "Task_Status__c"
587+
)[0].picklistValues
588+
map (item) -> item.value]]></ee:set-payload>
589+
</ee:message>
590+
</ee:transform>
591+
</flow>
570592
</mule>

src/main/resources/api/salesforce-data-api.raml

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1331,4 +1331,26 @@ uses:
13311331
"Description": "This task is urgent.",
13321332
"TaskTagName": "Urgency Tag"
13331333
}
1334-
]
1334+
]
1335+
/statuses:
1336+
get:
1337+
displayName: Get Task Statuses
1338+
description: Get all possible task status values from Salesforce
1339+
responses:
1340+
200:
1341+
body:
1342+
application/json:
1343+
type: array
1344+
items:
1345+
type: string
1346+
example: ["Not Started", "In Progress", "Completed"]
1347+
400:
1348+
body:
1349+
application/json:
1350+
example:
1351+
message: Bad request
1352+
404:
1353+
body:
1354+
application/json:
1355+
example:
1356+
message: Task statuses not found

0 commit comments

Comments
 (0)