Skip to content

Commit 741e876

Browse files
committed
update tasks
1 parent 4105e21 commit 741e876

File tree

4 files changed

+61
-20
lines changed

4 files changed

+61
-20
lines changed

src/app/(dashboard)/patients/[id]/actions.ts

+20-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,17 @@
11
"use server";
22

3-
import { pushResourceBundle } from "@/lib/fhir/bundle";
3+
import { BinaryPatchData, pushResourceBundle } from "@/lib/fhir/bundle";
44
import { fetchCarePlan } from "./fetch";
5-
import { CarePlanData, CarePlanDataActivity } from "../../../../lib/models/types";
5+
import {
6+
CarePlanData,
7+
CarePlanDataActivity,
8+
} from "../../../../lib/models/types";
69
import { fhirR4 } from "@smile-cdr/fhirts";
710
import { mapCarePlanToTask } from "@/lib/fhir/tasks";
11+
import { createJsonPatchUpdate } from "@/lib/utils";
812

913
export const fixTasks = async (formData: FormData) => {
10-
const resourcesToUpdate: fhirR4.Resource[] = [];
14+
const resourcesToUpdate: (fhirR4.Resource | BinaryPatchData)[] = [];
1115
const data = JSON.parse(formData.getAll("data")[0] as string) as {
1216
careplan: CarePlanData;
1317
items: CarePlanDataActivity[];
@@ -26,6 +30,7 @@ export const fixTasks = async (formData: FormData) => {
2630
const task = creatNewTask(data.careplan, activity);
2731
resourcesToUpdate.push(task);
2832
} else {
33+
2934
if (!activity.isTaskAndCarePlanSameStatus && activity.taskReference) {
3035
activity.taskStatus = mapCarePlanToTask(
3136
activity.carePlanActivityStatus
@@ -53,6 +58,18 @@ export const fixTasks = async (formData: FormData) => {
5358
activity.detail.status = mapCarePlan.get(taskId)
5459
?.carePlanActivityStatus as any;
5560
carePlan.activity![index] = activity;
61+
const taskUpdateBundle = {
62+
path: `Task/${taskId}`,
63+
isBinary: true,
64+
data: createJsonPatchUpdate([
65+
{
66+
op: "replace",
67+
path: "/status",
68+
value: mapCarePlan.get(taskId)?.taskStatus,
69+
},
70+
]),
71+
};
72+
resourcesToUpdate.push(taskUpdateBundle);
5673
}
5774
}
5875
if (mapCarePlan.size > 0) {

src/app/(dashboard)/patients/[id]/components/careplanContainer.tsx

+11-11
Original file line numberDiff line numberDiff line change
@@ -149,19 +149,19 @@ export const CarePlanContainer = ({ data, action }: Props) => {
149149
<div className="badge badge-accent">Scheduled Task</div>
150150
)}
151151
</div>
152-
</summary>
153-
<div className="collapse-content">
154-
<div className="flex flex-col p-2">
155-
<div className="flex flex-row gap-2">
156-
<span className="badge badge-secondary">
157-
CarePlan Status: {activity.carePlanActivityStatus}
158-
</span>
159-
<span className="badge badge-secondary">
160-
Task Status: {activity.taskStatus}
161-
</span>
152+
<div className="">
153+
<div className="flex flex-col p-2">
154+
<div className="flex flex-row gap-2">
155+
<span className="badge badge-neutral p-2">
156+
CarePlan Status: {activity.carePlanActivityStatus}
157+
</span>
158+
<span className="badge badge-primary p-2">
159+
Task Status: {activity.taskStatus}
160+
</span>
161+
</div>
162162
</div>
163163
</div>
164-
</div>
164+
</summary>
165165
</details>
166166
);
167167
})}

src/lib/fhir/bundle.ts

+21-6
Original file line numberDiff line numberDiff line change
@@ -3,17 +3,32 @@ import { fhirServer } from "../api/axios";
33
import { AxiosError } from "axios";
44
import { IBundle } from "@smile-cdr/fhirts/dist/FHIR-R4/interfaces/IBundle";
55

6-
export const pushResourceBundle = async (resources: fhirR4.Resource[]) => {
6+
export type BinaryPatchData = {
7+
data: fhirR4.Binary;
8+
path: string;
9+
isBinary: boolean;
10+
};
11+
12+
export const pushResourceBundle = async (
13+
resources: (fhirR4.Resource | BinaryPatchData)[]
14+
) => {
715
try {
816
const bundle = new fhirR4.Bundle();
917
bundle.type = "transaction";
1018
const entrries: fhirR4.BundleEntry[] = [];
1119
for (const resource of resources) {
1220
const entry = new fhirR4.BundleEntry();
13-
entry.resource = resource;
14-
entry.request = new fhirR4.BundleRequest();
15-
entry.request.method = "PUT";
16-
entry.request.url = `${resource.resourceType}/${resource.id}`;
21+
if ("isBinary" in resource) {
22+
entry.resource = resource.data;
23+
entry.request = new fhirR4.BundleRequest();
24+
entry.request.method = "PATCH";
25+
entry.request.url = resource.path;
26+
} else {
27+
entry.resource = resource;
28+
entry.request = new fhirR4.BundleRequest();
29+
entry.request.method = "PUT";
30+
entry.request.url = `${resource.resourceType}/${resource.id}`;
31+
}
1732
entrries.push(entry);
1833
}
1934

@@ -48,7 +63,7 @@ export const fetchBundle = async (
4863
};
4964
});
5065
console.log(JSON.stringify(bundle));
51-
66+
5267
const response = await fhirServer.post("/", bundle);
5368
return response.data;
5469
};

src/lib/utils.ts

+9
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
import { type ClassValue, clsx } from "clsx";
22
import { twMerge } from "tailwind-merge";
33
import { addDays, subMinutes, startOfDay } from "date-fns";
4+
import { fhirR4 } from "@smile-cdr/fhirts";
45

56
export function cn(...inputs: ClassValue[]) {
67
return twMerge(clsx(inputs));
@@ -44,3 +45,11 @@ export const paramGenerator = (
4445
.join("&")}`;
4546
};
4647

48+
export const createJsonPatchUpdate = (data: any) => {
49+
const binary = new fhirR4.Binary();
50+
binary.contentType = "application/json-patch+json";
51+
binary.resourceType = "Binary";
52+
binary.data = Buffer.from(JSON.stringify(data)).toString("base64");
53+
return binary;
54+
};
55+

0 commit comments

Comments
 (0)