import type { UserLoginNameAndPwd, BaseRetData, GetDoctorList, GetWardList, GetWardPatients, Login, UserInfo, GetPatientList, GetTeamList, GetPatientBookingList, GetTeamInfo, GetAppointments, GetDoctorAppointments, GetTreatmentRecords } from "./models" import {dateToTimestamp} from "~/utils/utils.ts"; export const apiEndpoint = import.meta.env.VITE_API_ENDPOINT export async function fetchAPI(path: string, method: string, body?: any, headers?: any, contentType: string | null = "application/json"): Promise { const baseHeaders: { [key: string]: any } = { "Authorization": `${localStorage.getItem("hms_token")}`, } if (contentType) { baseHeaders["Content-Type"] = contentType } let reqHeaders: any if (headers) { reqHeaders = {...baseHeaders, ...headers} } else { reqHeaders = baseHeaders } return new Promise((resolve, reject) => { fetch(`${apiEndpoint}/${path}`, { method, credentials: "include", headers: reqHeaders, body: contentType === "application/json" ? (body ? JSON.stringify(body) : undefined) : body, }) .then((v) => resolve(v)) .catch((e) => reject(e)) }) } export async function apiLogin(userName: string, password: string): Promise { const resp = await fetchAPI("login", "POST", { username: userName, password: password }) return resp.json() } export async function apiChangeMyPassword(old_password: string, newPassword: string): Promise { const resp = await fetchAPI("change_password", "POST", { old_password: old_password, new_password: newPassword }) return resp.json() } export async function apiRegisterPatient(regData: { username: string, password: string, name: string, title: string, birth_date: number, gender: string, phone: string, email: string, address: string, postcode: string, }): Promise { const resp = await fetchAPI("register_patient", "POST", regData) return resp.json() } export async function apiGetMyInfo(): Promise { const resp = await fetchAPI("get_my_info", "GET") return resp.json() } export async function apiGetWardList(page: number, no_limit: boolean = false): Promise { const resp = await fetchAPI(`get_ward_list?page=${page}&no_limit=${no_limit}`, "GET") return resp.json() } export async function apiEditWard(ward_id: number, ward_name: string, total_capacity: number, type: string): Promise { const resp = await fetchAPI("admin/edit_ward", "POST", { "ward_id": ward_id, "ward_name": ward_name, "total_capacity": total_capacity, "type": type }) return resp.json() } export async function apiDeleteWard(ward_id: number): Promise { const resp = await fetchAPI("admin/delete_ward", "DELETE", { "ward_id": ward_id, }) return resp.json() } export async function apiCreateWard(ward_name: string, total_capacity: number, type: string): Promise { const resp = await fetchAPI("admin/create_ward", "POST", { "ward_name": ward_name, "total_capacity": total_capacity, "type": type }) return resp.json() } export async function apiGetWardPatients(ward_id: number): Promise { const resp = await fetchAPI(`data/ward_patients?ward_id=${ward_id}`, "GET") return resp.json() } export async function apiGetDoctorsList(page: number): Promise { // set page to -1 to get all doctors const resp = await fetchAPI(`get_doctor_list?page=${page}`, "GET") return resp.json() } export async function apiEditDoctorInfo(data: { gender: string, phone: string, birth_date: number | Date, grade: number | string, name: string, title: string, email: string, is_admin: boolean, doctor_id?: number, id?: number }): Promise { const pushData = structuredClone(data) if (pushData.birth_date instanceof Date) { pushData.birth_date = dateToTimestamp(pushData.birth_date) } if (typeof pushData.grade === "string") { pushData.grade = Number(pushData.grade) } if (pushData.doctor_id === undefined) { pushData.doctor_id = pushData.id } const resp = await fetchAPI("admin/edit_doctor_info", "POST", pushData) return resp.json() } export async function apiSetDoctorResigned(doctor_id: number, is_resigned: boolean): Promise { const resp = await fetchAPI(`admin/set_resign_doctor?`, "POST", { "doctor_id": doctor_id, "is_resigned": is_resigned }) return resp.json() } export async function apiAdminRegister(data: { reg_type: number | string, // 0: patient, 1: doctor, 99: receptionist username: string, gender: string, phone: string, birth_date: number | Date, name: string, title: string, email: string, // team_id?: number, // doctor grade?: number | string, // doctor or receptionist is_admin?: boolean, // doctor or receptionist address?: string, postcode?: string // patient }): Promise { const pushData = structuredClone(data) if (pushData.birth_date instanceof Date) { pushData.birth_date = dateToTimestamp(pushData.birth_date) } if (pushData.grade && typeof pushData.grade === "string") { pushData.grade = Number(pushData.grade) } if (typeof pushData.reg_type === "string") { pushData.reg_type = Number(pushData.reg_type) } const resp = await fetchAPI("admin/register", "POST", pushData) return resp.json() } export async function apiResetPasswordFromRoleID(user_id: number, user_type: number): Promise { const resp = await fetchAPI("admin/reset_user_password_from_role_id", "POST", { "user_id": user_id, "user_type": user_type }) return resp.json() } export async function apiGetTeamList(page: number): Promise { // set page to -1 to get all teams const resp = await fetchAPI(`get_team_list?page=${page}`, "GET") return resp.json() } export async function apiEditTeam(data: { team_id: number, department: string, consultant_id: number, is_admin_team: boolean, team_members: number[] | null, // no change team members if null }): Promise { const resp = await fetchAPI("admin/edit_team_info", "POST", data) return resp.json() } export async function apiCreateTeam(data: { department: string, consultant_id: number, is_admin_team: boolean, team_members: number[] | null, }): Promise { const resp = await fetchAPI("admin/create_doctor_team", "POST", data) return resp.json() } export async function apiDeleteTeam(team_id: number): Promise { const resp = await fetchAPI("admin/delete_doctor_team", "DELETE", { "team_id": team_id, }) return resp.json() } export async function get_team_info(team_id: number): Promise { const resp = await fetchAPI(`get_team_info?team_id=${team_id}`, "GET") return resp.json() } export async function apiGetPatientsList(page: number): Promise { // set page to -1 to get all patients const resp = await fetchAPI(`admin/get_patient_list?page=${page}`, "GET") return resp.json() } export async function apiPatientBooking(data: { appointment_time: number, // timestamp category: string, // BookingCategory description: string }): Promise { const resp = await fetchAPI("patient/book", "POST", data) return resp.json() } export async function apiGetPatientBookingList(page: number): Promise { const resp = await fetchAPI(`patient/appointments?page=${page}`, "GET") return resp.json() } export async function apiEditPatientBooking(data: { appointment_id: number, appointment_time: number, // timestamp category: string, // BookingCategory description: string, }): Promise { const resp = await fetchAPI("patient/edit_appointment", "POST", data) return resp.json() } export async function apiDeletePatientBooking(appointment_id: number): Promise { const resp = await fetchAPI("patient/cancel_appointment", "DELETE", { "appointment_id": appointment_id, }) return resp.json() } export async function apiGetAllAppointments(page: number, include_discharged: boolean): Promise { const resp = await fetchAPI(`receptionist/appointments?page=${page}&include_discharged=${include_discharged}`, "GET") return resp.json() } export async function apiProcessAppointment(appointment_id: number, approved: boolean, feedback: string, assigned_team: number | null): Promise { const resp = await fetchAPI("receptionist/process_appointment", "POST", { "appointment_id": appointment_id, "approved": approved, "feedback": feedback, "assigned_team": assigned_team }) return resp.json() } export async function apiPatientAdmission(appointment_id: number, ward_id: number): Promise { const resp = await fetchAPI("receptionist/check_in", "POST", { "appointment_id": appointment_id, "ward_id": ward_id }) return resp.json() } // export async function apiTransferWard(admission_id: number, target_ward_id: number): Promise { // const resp = await fetchAPI("admin/transfer_ward", "POST", { // "admission_id": admission_id, // "target_ward_id": target_ward_id // }) // return resp.json() // } export async function apiTransferWard(patient_id: number, target_ward_id: number): Promise { const resp = await fetchAPI("admin/transfer_ward", "POST", { "patient_id": patient_id, "target_ward_id": target_ward_id }) return resp.json() } export async function apiGetDoctorAppointments(target_team_id?: number): Promise { const resp = await fetchAPI(`doctor/appointments?target_team=${target_team_id}`, "GET") return resp.json() } export async function apiDoctorTreat(appointment_id: number, treat_info: string, treated_at: number): Promise { const resp = await fetchAPI("doctor/treat", "POST", { "appointment_id": appointment_id, "treat_info": treat_info, "treated_at": treated_at // timestamp }) return resp.json() } export async function apiGetTreatmentRecords(page: number, patient_id: number | null, doctor_id: number | null, team_id: number | null, all: boolean = false): Promise { const resp = await fetchAPI(`data/treatment_doctors?patient_id=${patient_id}&doctor_id=${doctor_id}&team_id=${team_id}&page=${page}&all=${all}`, "GET") return resp.json() } export async function apiEditPatientInfo(data: { gender: string, phone: string, birth_date: number | Date, address: string, name: string, title: string, email: string, postcode: string, patient_id?: number, id?: number }): Promise { const pushData = structuredClone(data) if (pushData.birth_date instanceof Date) { pushData.birth_date = dateToTimestamp(pushData.birth_date) } if (pushData.patient_id === undefined) { pushData.patient_id = pushData.id } const resp = await fetchAPI("admin/edit_patient_info", "POST", pushData) return resp.json() } export async function apiPatientDischarge(admission_id: number): Promise { const resp = await fetchAPI("admin/patient_discharge", "POST", { "admission_id": admission_id }) return resp.json() } export async function apiPatientGetCurrentWard(): Promise { const resp = await fetchAPI("patient/get_my_ward", "GET") return resp.json() }