@bulutklinik/sdk 0.1.0
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/DESIGN.md +482 -0
- package/LICENSE +21 -0
- package/README.md +154 -0
- package/dist/index.cjs +647 -0
- package/dist/index.cjs.map +1 -0
- package/dist/index.d.cts +509 -0
- package/dist/index.d.ts +509 -0
- package/dist/index.js +628 -0
- package/dist/index.js.map +1 -0
- package/package.json +72 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../src/token-store.ts","../src/config.ts","../src/errors.ts","../src/types.ts","../src/http.ts","../src/resources/appointments.ts","../src/resources/auth.ts","../src/resources/doctors.ts","../src/resources/measures.ts","../src/resources/payments.ts","../src/resources/slots.ts","../src/client.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import type { MaybePromise } from \"./types\";\n\n/**\n * Pluggable token persistence. The default is in-memory; provide a custom\n * implementation to persist tokens to a file, database or secure storage.\n * All methods may be synchronous or return a promise.\n */\nexport interface TokenStore {\n getAccessToken(): MaybePromise<string | null>;\n getRefreshToken(): MaybePromise<string | null>;\n setTokens(accessToken: string, refreshToken: string | null): MaybePromise<void>;\n clear(): MaybePromise<void>;\n}\n\n/** In-memory token store (default). Tokens are lost when the process exits. */\nexport class MemoryTokenStore implements TokenStore {\n #access: string | null;\n #refresh: string | null;\n\n constructor(seed?: { accessToken?: string | null; refreshToken?: string | null }) {\n this.#access = seed?.accessToken ?? null;\n this.#refresh = seed?.refreshToken ?? null;\n }\n\n getAccessToken(): string | null {\n return this.#access;\n }\n\n getRefreshToken(): string | null {\n return this.#refresh;\n }\n\n setTokens(accessToken: string, refreshToken: string | null): void {\n this.#access = accessToken;\n this.#refresh = refreshToken;\n }\n\n clear(): void {\n this.#access = null;\n this.#refresh = null;\n }\n}\n","import { MemoryTokenStore, type TokenStore } from \"./token-store\";\nimport type { Lang } from \"./types\";\n\nexport type Environment = \"production\" | \"test\" | \"local\";\n\nexport const ENVIRONMENT_BASE_URLS: Record<Environment, string> = {\n production: \"https://api.bulutklinik.com/api/v3\",\n test: \"https://apitest.bulutklinik.com/api/v3\",\n local: \"https://api-bulutklinik.test/api/v3\",\n};\n\nexport type FetchLike = typeof fetch;\n\nexport interface ClientOptions {\n /** Named environment preset. Ignored when `baseUrl` is provided. Default: `production`. */\n environment?: Environment;\n /** Explicit base URL (e.g. `https://api.bulutklinik.com/api/v3`). Overrides `environment`. */\n baseUrl?: string;\n /** Default `lang` header. Default: `tr`. */\n lang?: Lang;\n /** OAuth client id — used by `auth.connect` and for token refresh. */\n clientId?: string;\n /** OAuth client secret — used by `auth.connect` and for token refresh. */\n clientSecret?: string;\n /** Bearer token for the partner (`teusan`) endpoint. */\n partnerToken?: string;\n /** Pluggable token persistence. Default: in-memory. */\n tokenStore?: TokenStore;\n /** Per-request timeout in milliseconds. Default: 30000. */\n timeoutMs?: number;\n /** Injectable fetch implementation. Default: global `fetch`. */\n fetch?: FetchLike;\n}\n\nexport interface ResolvedConfig {\n baseUrl: string;\n lang: Lang;\n clientId?: string;\n clientSecret?: string;\n partnerToken?: string;\n tokenStore: TokenStore;\n timeoutMs: number;\n fetchImpl: FetchLike;\n}\n\nexport function resolveConfig(options: ClientOptions = {}): ResolvedConfig {\n const base = options.baseUrl ?? ENVIRONMENT_BASE_URLS[options.environment ?? \"production\"];\n // Use the caller's fetch as-is; bind the global default to `globalThis` so it\n // works when called detached from its receiver (browsers otherwise throw\n // \"Illegal invocation\"). Node's fetch is unaffected either way.\n const fetchImpl =\n options.fetch ??\n (typeof globalThis.fetch === \"function\" ? globalThis.fetch.bind(globalThis) : undefined);\n if (typeof fetchImpl !== \"function\") {\n throw new Error(\n \"No fetch implementation available. Provide options.fetch or run on Node >= 18.\",\n );\n }\n return {\n baseUrl: base.replace(/\\/+$/, \"\"),\n lang: options.lang ?? \"tr\",\n clientId: options.clientId,\n clientSecret: options.clientSecret,\n partnerToken: options.partnerToken,\n tokenStore: options.tokenStore ?? new MemoryTokenStore(),\n timeoutMs: options.timeoutMs ?? 30_000,\n fetchImpl,\n };\n}\n","export interface ApiErrorContext {\n httpStatus: number;\n resultType?: number;\n errorType?: string | number;\n data?: unknown;\n method: string;\n path: string;\n retryAfter?: number;\n}\n\n/** Base class for every error thrown by the SDK. */\nexport class BulutklinikError extends Error {\n constructor(message: string, options?: { cause?: unknown }) {\n super(message, options);\n this.name = new.target.name;\n }\n}\n\n/** Network failure, timeout, DNS or TLS error — no HTTP response was received. */\nexport class TransportError extends BulutklinikError {\n constructor(message: string, cause?: unknown) {\n super(message, { cause });\n }\n}\n\n/** An HTTP response was received but the call was not successful. */\nexport class ApiError extends BulutklinikError {\n readonly httpStatus: number;\n readonly resultType: number | undefined;\n readonly errorType: string | number | undefined;\n readonly data: unknown;\n readonly method: string;\n readonly path: string;\n\n constructor(message: string, ctx: ApiErrorContext) {\n super(message);\n this.httpStatus = ctx.httpStatus;\n this.resultType = ctx.resultType;\n this.errorType = ctx.errorType;\n this.data = ctx.data;\n this.method = ctx.method;\n this.path = ctx.path;\n }\n}\n\n/** 422 / errorType=validation. */\nexport class ValidationError extends ApiError {}\n/** 401, a logout (resultType 2), or a failed token refresh. */\nexport class AuthenticationError extends ApiError {}\n/** 403 — authenticated but not permitted / out of scope. */\nexport class AuthorizationError extends ApiError {}\n/** 404. */\nexport class NotFoundError extends ApiError {}\n\n/** 429 — throttled. Carries `retryAfter` (seconds) when the header is present. */\nexport class RateLimitError extends ApiError {\n readonly retryAfter: number | undefined;\n\n constructor(message: string, ctx: ApiErrorContext) {\n super(message, ctx);\n this.retryAfter = ctx.retryAfter;\n }\n}\n\n/**\n * Map an API failure to the most specific error type.\n * Precedence: logout (resultType 2) → errorType=validation → HTTP status.\n */\nexport function createApiError(ctx: ApiErrorContext, message: string): ApiError {\n if (ctx.resultType === 2) return new AuthenticationError(message, ctx);\n\n const type = typeof ctx.errorType === \"string\" ? ctx.errorType.toLowerCase() : undefined;\n if (type === \"validation\" || ctx.httpStatus === 422) {\n return new ValidationError(message, ctx);\n }\n\n switch (ctx.httpStatus) {\n case 401:\n return new AuthenticationError(message, ctx);\n case 403:\n return new AuthorizationError(message, ctx);\n case 404:\n return new NotFoundError(message, ctx);\n case 429:\n return new RateLimitError(message, ctx);\n default:\n return new ApiError(message, ctx);\n }\n}\n","/** Supported UI/content languages for the `lang` header. */\nexport type Lang = \"tr\" | \"en\" | \"de\" | \"az\";\n\n/**\n * Envelope `resultType` state codes returned by the Bulutklinik API.\n * A call is successful only when HTTP is 2xx AND resultType === Success (0).\n */\nexport const ResultType = {\n Success: 0,\n Error: 1,\n Logout: 2,\n Update: 3,\n Refresh: 4,\n} as const;\n\nexport type ResultTypeValue = (typeof ResultType)[keyof typeof ResultType];\n\n/** The standard response envelope wrapping every API response. */\nexport interface Envelope<T = unknown> {\n resultType?: number;\n /** May be a string label or a numeric code depending on the endpoint. */\n errorType?: string | number;\n errorMessage?: string;\n successMessage?: string;\n data?: T;\n}\n\nexport type MaybePromise<T> = T | Promise<T>;\n","import type { FetchLike, ResolvedConfig } from \"./config\";\nimport {\n TransportError,\n createApiError,\n type ApiError,\n type ApiErrorContext,\n} from \"./errors\";\nimport type { TokenStore } from \"./token-store\";\nimport { ResultType, type Envelope, type Lang } from \"./types\";\n\nexport type AuthMode = \"public\" | \"bearer\" | \"partner\";\n\nexport interface RequestSpec {\n method: \"GET\" | \"POST\" | \"PUT\" | \"DELETE\";\n path: string;\n auth: AuthMode;\n body?: unknown;\n lang?: Lang;\n}\n\n/**\n * Low-level transport. Builds requests, unwraps the response envelope, maps\n * failures to typed errors, and performs a single silent token refresh + retry\n * on a 401 / `resultType 4`. Concurrent refreshes share one in-flight promise.\n */\nexport class HttpClient {\n readonly tokenStore: TokenStore;\n readonly clientId: string | undefined;\n readonly clientSecret: string | undefined;\n\n private readonly baseUrl: string;\n private readonly lang: Lang;\n private readonly partnerToken: string | undefined;\n private readonly timeoutMs: number;\n private readonly fetchImpl: FetchLike;\n private refreshInFlight: Promise<void> | null = null;\n\n constructor(config: ResolvedConfig) {\n this.baseUrl = config.baseUrl;\n this.lang = config.lang;\n this.clientId = config.clientId;\n this.clientSecret = config.clientSecret;\n this.partnerToken = config.partnerToken;\n this.tokenStore = config.tokenStore;\n this.timeoutMs = config.timeoutMs;\n this.fetchImpl = config.fetchImpl;\n }\n\n request<T>(spec: RequestSpec): Promise<T> {\n return this.send<T>(spec, false);\n }\n\n /** Force a token refresh using the stored refresh token. Throws on failure. */\n async refresh(): Promise<void> {\n await this.performRefresh();\n }\n\n private async send<T>(spec: RequestSpec, isRetry: boolean): Promise<T> {\n const response = await this.dispatch(spec);\n const envelope = await this.readEnvelope(response);\n\n if (response.ok && envelope.resultType === ResultType.Success) {\n return envelope.data as T;\n }\n\n const expired = response.status === 401 || envelope.resultType === ResultType.Refresh;\n if (spec.auth === \"bearer\" && expired && !isRetry) {\n const refreshed = await this.ensureRefreshed();\n if (refreshed) {\n return this.send<T>(spec, true);\n }\n }\n\n if (envelope.resultType === ResultType.Logout) {\n await this.tokenStore.clear();\n }\n\n throw this.toError(spec, response, envelope);\n }\n\n private async dispatch(spec: RequestSpec): Promise<Response> {\n const url = this.baseUrl + spec.path;\n const headers: Record<string, string> = {\n Accept: \"application/json\",\n lang: spec.lang ?? this.lang,\n };\n const hasBody = spec.body !== undefined && spec.method !== \"GET\";\n if (hasBody) headers[\"Content-Type\"] = \"application/json\";\n\n if (spec.auth === \"bearer\") {\n const token = await this.tokenStore.getAccessToken();\n if (token) headers.Authorization = `Bearer ${token}`;\n } else if (spec.auth === \"partner\") {\n if (this.partnerToken) headers.Authorization = `Bearer ${this.partnerToken}`;\n }\n\n const controller = new AbortController();\n const timer = setTimeout(() => controller.abort(), this.timeoutMs);\n try {\n return await this.fetchImpl(url, {\n method: spec.method,\n headers,\n body: hasBody ? JSON.stringify(spec.body) : undefined,\n signal: controller.signal,\n });\n } catch (error) {\n if (controller.signal.aborted) {\n throw new TransportError(\n `Request ${spec.method} ${spec.path} timed out after ${this.timeoutMs}ms`,\n error,\n );\n }\n throw new TransportError(`Network error on ${spec.method} ${spec.path}`, error);\n } finally {\n clearTimeout(timer);\n }\n }\n\n private async readEnvelope(response: Response): Promise<Envelope> {\n const text = await response.text();\n if (!text) return {};\n try {\n return JSON.parse(text) as Envelope;\n } catch {\n // Non-JSON body — not expected for the covered endpoints.\n return { errorMessage: text };\n }\n }\n\n private async ensureRefreshed(): Promise<boolean> {\n if (!this.refreshInFlight) {\n this.refreshInFlight = this.performRefresh().finally(() => {\n this.refreshInFlight = null;\n });\n }\n try {\n await this.refreshInFlight;\n return true;\n } catch {\n return false;\n }\n }\n\n private async performRefresh(): Promise<void> {\n const refreshToken = await this.tokenStore.getRefreshToken();\n if (!refreshToken) throw new Error(\"No refresh token available\");\n if (!this.clientId || !this.clientSecret) {\n throw new Error(\"clientId and clientSecret are required to refresh tokens\");\n }\n\n const response = await this.dispatch({\n method: \"POST\",\n path: \"/general/refreshApi\",\n auth: \"public\",\n body: { refreshToken, clientId: this.clientId, clientSecretKey: this.clientSecret },\n });\n const envelope = await this.readEnvelope(response);\n const data = envelope.data as { access_token?: string; refresh_token?: string } | undefined;\n\n if (!response.ok || envelope.resultType !== ResultType.Success || !data?.access_token) {\n await this.tokenStore.clear();\n throw new Error(\"Token refresh failed\");\n }\n await this.tokenStore.setTokens(data.access_token, data.refresh_token ?? refreshToken);\n }\n\n private toError(spec: RequestSpec, response: Response, envelope: Envelope): ApiError {\n const retryAfterHeader = response.headers.get(\"retry-after\");\n const ctx: ApiErrorContext = {\n httpStatus: response.status,\n resultType: envelope.resultType,\n errorType: envelope.errorType,\n data: envelope.data,\n method: spec.method,\n path: spec.path,\n retryAfter: retryAfterHeader ? Number(retryAfterHeader) : undefined,\n };\n const message =\n envelope.errorMessage ??\n `Bulutklinik API request failed: ${spec.method} ${spec.path} (HTTP ${response.status})`;\n return createApiError(ctx, message);\n }\n}\n","import type { HttpClient } from \"../http\";\nimport type { PhysicalAppointmentInput, ReserveInterviewInput } from \"../models\";\n\n/** Online reservation, physical appointment and cancellation. */\nexport class AppointmentsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Reserve an online (interview) slot. Resolves to `null` on success. */\n reserveInterview(input: ReserveInterviewInput): Promise<null> {\n return this.http.request<null>({\n method: \"POST\",\n path: \"/patients/addInterviewDateReservation\",\n auth: \"bearer\",\n body: {\n doctorId: input.doctorId,\n appointmentDate: input.appointmentDate,\n appointmentType: input.appointmentType ?? \"interview\",\n },\n });\n }\n\n /** Create a physical appointment. */\n addPhysical(input: PhysicalAppointmentInput): Promise<unknown> {\n return this.http.request<unknown>({\n method: \"POST\",\n path: \"/patients/addNewAppointment\",\n auth: \"bearer\",\n body: { doctorId: input.doctorId, appointmentDate: input.appointmentDate },\n });\n }\n\n /** Cancel an appointment by event id (`cln_events.id`). */\n cancel(eventId: number | string): Promise<unknown> {\n return this.http.request<unknown>({\n method: \"DELETE\",\n path: `/patients/deleteUserAppointment/${eventId}`,\n auth: \"bearer\",\n });\n }\n}\n","import type { HttpClient } from \"../http\";\nimport type {\n ConnectInput,\n LoginData,\n LoginResult,\n RegisterInput,\n TwoFactorInput,\n} from \"../models\";\n\n/** Login, 2FA, token refresh, registration and logout. */\nexport class AuthResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Log in. On success tokens are stored automatically and\n * `{ twoFactorRequired: false }` is returned. If 2FA is enabled the result is\n * `{ twoFactorRequired: true, twoFactorResponse }` — pass that blob to\n * {@link connectWithTwoFactor} together with the SMS code.\n */\n async connect(input: ConnectInput): Promise<LoginResult> {\n const data = await this.http.request<LoginData>({\n method: \"POST\",\n path: \"/general/connectApi\",\n auth: \"public\",\n body: {\n apiUserName: input.apiUserName,\n apiUserPassword: input.apiUserPassword,\n apiClientId: input.clientId ?? this.http.clientId,\n apiSecretKey: input.clientSecret ?? this.http.clientSecret,\n loginMode: input.loginMode,\n ...(input.withPhoneNumber !== undefined\n ? { withPhoneNumber: input.withPhoneNumber }\n : {}),\n },\n });\n\n if (data.access_token) {\n await this.storeTokens(data);\n return { twoFactorRequired: false, passwordPolicy: data.password_policy };\n }\n if (data.response) {\n return { twoFactorRequired: true, twoFactorResponse: data.response };\n }\n return { twoFactorRequired: false };\n }\n\n /** Complete a 2FA login with the SMS code and the challenge blob. */\n async connectWithTwoFactor(input: TwoFactorInput): Promise<void> {\n const data = await this.http.request<LoginData>({\n method: \"POST\",\n path: \"/general/connectApiWithTwoFactor\",\n auth: \"public\",\n body: { smsVerificationCode: input.smsVerificationCode, response: input.response },\n });\n await this.storeTokens(data);\n }\n\n /** Register a new patient (afterRegister auto-login). Stores tokens on success. */\n async register(input: RegisterInput): Promise<void> {\n const data = await this.http.request<LoginData>({\n method: \"POST\",\n path: \"/patients/addNewPatient\",\n auth: \"public\",\n body: {\n name: input.name,\n surname: input.surname,\n apiUserName: input.apiUserName,\n phoneNumber: input.phoneNumber,\n password: input.password,\n smsVerificationCode: input.smsVerificationCode,\n response: input.response,\n acceptUserAgreement: input.acceptUserAgreement ?? 1,\n apiClientId: input.clientId ?? this.http.clientId,\n apiSecretKey: input.clientSecret ?? this.http.clientSecret,\n },\n });\n await this.storeTokens(data);\n }\n\n /** Manually refresh the access token using the stored refresh token. */\n refresh(): Promise<void> {\n return this.http.refresh();\n }\n\n /** Revoke the current tokens server-side and clear the local token store. */\n async disconnect(): Promise<void> {\n try {\n await this.http.request<unknown>({\n method: \"POST\",\n path: \"/general/disconnectApi\",\n auth: \"bearer\",\n body: {},\n });\n } finally {\n await this.http.tokenStore.clear();\n }\n }\n\n private async storeTokens(data: LoginData): Promise<void> {\n if (!data.access_token) {\n throw new Error(\"Login response did not contain an access token\");\n }\n await this.http.tokenStore.setTokens(data.access_token, data.refresh_token ?? null);\n }\n}\n","import type { HttpClient } from \"../http\";\nimport type {\n Branch,\n DoctorDetail,\n DoctorSearchInput,\n DoctorSearchResult,\n Location,\n QuickSearchInput,\n QuickSearchResult,\n} from \"../models\";\n\n/** Branches, locations, quick/filtered doctor search and doctor detail. */\nexport class DoctorsResource {\n constructor(private readonly http: HttpClient) {}\n\n branches(): Promise<Branch[]> {\n return this.http.request<Branch[]>({\n method: \"GET\",\n path: \"/patients/allBranches\",\n auth: \"bearer\",\n });\n }\n\n locations(): Promise<Location[]> {\n return this.http.request<Location[]>({\n method: \"GET\",\n path: \"/patients/allLocations\",\n auth: \"bearer\",\n });\n }\n\n quickSearch(input: QuickSearchInput): Promise<QuickSearchResult> {\n return this.http.request<QuickSearchResult>({\n method: \"POST\",\n path: \"/patients/quickSearch\",\n auth: \"bearer\",\n body: {\n searchText: input.searchText,\n listType: input.listType ?? null,\n location: input.location ?? null,\n },\n });\n }\n\n search(input: DoctorSearchInput): Promise<DoctorSearchResult> {\n return this.http.request<DoctorSearchResult>({\n method: \"POST\",\n path: \"/patients/filteredSearch\",\n auth: \"bearer\",\n body: {\n searchParams: input.searchParams ?? {},\n orderParams: input.orderParams ?? [],\n otherParams: input.otherParams ?? [],\n currentPage: input.currentPage,\n perPageLimit: input.perPageLimit ?? 20,\n },\n });\n }\n\n detail(id: number | string, corporate?: number | string): Promise<DoctorDetail> {\n const path =\n corporate !== undefined\n ? `/patients/doctorDetail/${id}/${corporate}`\n : `/patients/doctorDetail/${id}`;\n return this.http.request<DoctorDetail>({ method: \"GET\", path, auth: \"bearer\" });\n }\n}\n","import type { HttpClient } from \"../http\";\nimport type {\n GraphPeriod,\n MeasureFields,\n MeasureRecord,\n MeasureType,\n PartnerHealthInput,\n} from \"../models\";\n\n/** Health measurements: CRUD, latest, history list, graph and partner submission. */\nexport class MeasuresResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Submit multiple measurements of any types in one call (primary entrypoint). */\n addList(records: MeasureRecord[]): Promise<unknown> {\n return this.http.request<unknown>({\n method: \"POST\",\n path: \"/patients/addNewUserMeasures\",\n auth: \"bearer\",\n body: { data: records },\n });\n }\n\n /** Submit a single measurement of one type. */\n add(type: MeasureType, fields: MeasureFields): Promise<unknown> {\n return this.http.request<unknown>({\n method: \"POST\",\n path: `/patients/addNewUserMeasures/${type}`,\n auth: \"bearer\",\n body: fields,\n });\n }\n\n update(\n type: MeasureType,\n input: { id: number | string } & MeasureFields,\n ): Promise<unknown> {\n return this.http.request<unknown>({\n method: \"PUT\",\n path: `/patients/updateUserMeasures/${type}`,\n auth: \"bearer\",\n body: input,\n });\n }\n\n delete(type: MeasureType, id: number | string): Promise<unknown> {\n return this.http.request<unknown>({\n method: \"DELETE\",\n path: `/patients/deleteUserMeasures/${type}`,\n auth: \"bearer\",\n body: { id },\n });\n }\n\n /** Latest value of each measurement type. */\n last(): Promise<Record<string, unknown>> {\n return this.http.request<Record<string, unknown>>({\n method: \"GET\",\n path: \"/patients/measuresList\",\n auth: \"bearer\",\n });\n }\n\n /** Paginated history for one type. `glucoseType` (0/1) applies only to glucose. */\n list(\n type: MeasureType,\n page: number | string,\n glucoseType?: 0 | 1,\n ): Promise<unknown> {\n const path =\n glucoseType !== undefined\n ? `/patients/userMeasuresList/${type}/${page}/${glucoseType}`\n : `/patients/userMeasuresList/${type}/${page}`;\n return this.http.request<unknown>({ method: \"GET\", path, auth: \"bearer\" });\n }\n\n /** Grouped graph data. `period`: 1=day, 2=week, 3=month, 4=year. */\n graph(\n type: MeasureType,\n period: GraphPeriod,\n page: number | string,\n glucoseType?: 0 | 1,\n ): Promise<unknown> {\n const path =\n glucoseType !== undefined\n ? `/patients/userMeasuresGraph/${type}/${period}/${page}/${glucoseType}`\n : `/patients/userMeasuresGraph/${type}/${period}/${page}`;\n return this.http.request<unknown>({ method: \"GET\", path, auth: \"bearer\" });\n }\n\n /** Partner (teusan) submission — uses the configured partner token. */\n partnerHealthInformation(input: PartnerHealthInput): Promise<unknown> {\n return this.http.request<unknown>({\n method: \"POST\",\n path: \"/outher/healthInformation\",\n auth: \"partner\",\n body: { identity: input.identity, phoneNumber: input.phoneNumber, data: input.data },\n });\n }\n}\n","import type { HttpClient } from \"../http\";\nimport type {\n CardInfo,\n DiscountCheckInput,\n DiscountResult,\n PaymentInput,\n PaymentResult,\n SavedCard,\n} from \"../models\";\n\n/** Discount check, saved cards and the 3DS payment entrypoint. */\nexport class PaymentsResource {\n constructor(private readonly http: HttpClient) {}\n\n /** Validate a discount code. Note: this endpoint lives under the `patients` prefix. */\n checkDiscountCode(input: DiscountCheckInput): Promise<DiscountResult> {\n return this.http.request<DiscountResult>({\n method: \"POST\",\n path: \"/patients/checkDiscountCode\",\n auth: \"bearer\",\n body: { ...input },\n });\n }\n\n getCards(): Promise<{ cards: SavedCard[] }> {\n return this.http.request<{ cards: SavedCard[] }>({\n method: \"GET\",\n path: \"/payments/getCards\",\n auth: \"bearer\",\n });\n }\n\n saveCard(card: CardInfo): Promise<unknown> {\n return this.http.request<unknown>({\n method: \"POST\",\n path: \"/payments/saveCard\",\n auth: \"bearer\",\n body: { ...card },\n });\n }\n\n /**\n * Start an appointment payment. The amount is computed server-side. On a 3DS\n * flow the result carries `payment3DUrl` — a browser URL to open; the SDK does\n * not follow it. 3DS capture happens via the bank → server callback.\n */\n pay(input: PaymentInput): Promise<PaymentResult> {\n return this.http.request<PaymentResult>({\n method: \"POST\",\n path: \"/payments/interviewPayment\",\n auth: \"bearer\",\n body: {\n doctorId: input.doctorId,\n appointmentDate: input.appointmentDate,\n appointmentType: input.appointmentType ?? \"interview\",\n is3D: input.is3D,\n termsAccept: input.termsAccept,\n saveCard: input.saveCard ?? 0,\n discountCode: input.discountCode ?? \"\",\n ...(input.cardId !== undefined ? { cardId: input.cardId } : {}),\n ...(input.cardInfo ? { cardInfo: input.cardInfo } : {}),\n ...(input.caseDetail ? { caseDetail: input.caseDetail } : {}),\n },\n });\n }\n\n deleteCard(cardId: number | string): Promise<unknown> {\n return this.http.request<unknown>({\n method: \"DELETE\",\n path: `/payments/deleteCard/${cardId}`,\n auth: \"bearer\",\n });\n }\n}\n","import type { HttpClient } from \"../http\";\nimport type { SchedulerInput, SchedulerResult } from \"../models\";\n\n/** Doctor availability (materialized slots). */\nexport class SlotsResource {\n constructor(private readonly http: HttpClient) {}\n\n /**\n * Fetch a doctor's free slots. Returns a date-keyed map of slots. Build the\n * next step's `appointmentDate` as `\"<date> <slotStart>\"` (drop the seconds).\n */\n schedule(input: SchedulerInput): Promise<SchedulerResult> {\n return this.http.request<SchedulerResult>({\n method: \"POST\",\n path: \"/patients/doctorScheduler\",\n auth: \"bearer\",\n body: {\n doctorId: input.doctorId,\n scheduleDate: input.scheduleDate ?? null,\n scheduleStep: input.scheduleStep ?? \"7\",\n schedulePage: input.schedulePage ?? \"1\",\n listType: input.listType,\n },\n });\n }\n}\n","import { resolveConfig, type ClientOptions } from \"./config\";\nimport { HttpClient } from \"./http\";\nimport { AppointmentsResource } from \"./resources/appointments\";\nimport { AuthResource } from \"./resources/auth\";\nimport { DoctorsResource } from \"./resources/doctors\";\nimport { MeasuresResource } from \"./resources/measures\";\nimport { PaymentsResource } from \"./resources/payments\";\nimport { SlotsResource } from \"./resources/slots\";\nimport type { TokenStore } from \"./token-store\";\n\n/**\n * The Bulutklinik API client. Construct once and reuse; service groups are\n * exposed as properties.\n *\n * @example\n * ```ts\n * const client = new BulutklinikClient({\n * environment: \"test\",\n * clientId: \"…\",\n * clientSecret: \"…\",\n * });\n * await client.auth.connect({ apiUserName: \"…\", apiUserPassword: \"…\", loginMode: \"email\" });\n * const result = await client.doctors.quickSearch({ searchText: \"kardiyo\" });\n * ```\n */\nexport class BulutklinikClient {\n readonly auth: AuthResource;\n readonly doctors: DoctorsResource;\n readonly slots: SlotsResource;\n readonly appointments: AppointmentsResource;\n readonly payments: PaymentsResource;\n readonly measures: MeasuresResource;\n /** The active token store (also accepts a custom one via options). */\n readonly tokenStore: TokenStore;\n\n private readonly http: HttpClient;\n\n constructor(options?: ClientOptions) {\n const config = resolveConfig(options);\n this.http = new HttpClient(config);\n this.tokenStore = config.tokenStore;\n\n this.auth = new AuthResource(this.http);\n this.doctors = new DoctorsResource(this.http);\n this.slots = new SlotsResource(this.http);\n this.appointments = new AppointmentsResource(this.http);\n this.payments = new PaymentsResource(this.http);\n this.measures = new MeasuresResource(this.http);\n }\n}\n"]}
|
package/dist/index.d.cts
ADDED
|
@@ -0,0 +1,509 @@
|
|
|
1
|
+
/** Supported UI/content languages for the `lang` header. */
|
|
2
|
+
type Lang = "tr" | "en" | "de" | "az";
|
|
3
|
+
/**
|
|
4
|
+
* Envelope `resultType` state codes returned by the Bulutklinik API.
|
|
5
|
+
* A call is successful only when HTTP is 2xx AND resultType === Success (0).
|
|
6
|
+
*/
|
|
7
|
+
declare const ResultType: {
|
|
8
|
+
readonly Success: 0;
|
|
9
|
+
readonly Error: 1;
|
|
10
|
+
readonly Logout: 2;
|
|
11
|
+
readonly Update: 3;
|
|
12
|
+
readonly Refresh: 4;
|
|
13
|
+
};
|
|
14
|
+
type ResultTypeValue = (typeof ResultType)[keyof typeof ResultType];
|
|
15
|
+
/** The standard response envelope wrapping every API response. */
|
|
16
|
+
interface Envelope<T = unknown> {
|
|
17
|
+
resultType?: number;
|
|
18
|
+
/** May be a string label or a numeric code depending on the endpoint. */
|
|
19
|
+
errorType?: string | number;
|
|
20
|
+
errorMessage?: string;
|
|
21
|
+
successMessage?: string;
|
|
22
|
+
data?: T;
|
|
23
|
+
}
|
|
24
|
+
type MaybePromise<T> = T | Promise<T>;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* Pluggable token persistence. The default is in-memory; provide a custom
|
|
28
|
+
* implementation to persist tokens to a file, database or secure storage.
|
|
29
|
+
* All methods may be synchronous or return a promise.
|
|
30
|
+
*/
|
|
31
|
+
interface TokenStore {
|
|
32
|
+
getAccessToken(): MaybePromise<string | null>;
|
|
33
|
+
getRefreshToken(): MaybePromise<string | null>;
|
|
34
|
+
setTokens(accessToken: string, refreshToken: string | null): MaybePromise<void>;
|
|
35
|
+
clear(): MaybePromise<void>;
|
|
36
|
+
}
|
|
37
|
+
/** In-memory token store (default). Tokens are lost when the process exits. */
|
|
38
|
+
declare class MemoryTokenStore implements TokenStore {
|
|
39
|
+
#private;
|
|
40
|
+
constructor(seed?: {
|
|
41
|
+
accessToken?: string | null;
|
|
42
|
+
refreshToken?: string | null;
|
|
43
|
+
});
|
|
44
|
+
getAccessToken(): string | null;
|
|
45
|
+
getRefreshToken(): string | null;
|
|
46
|
+
setTokens(accessToken: string, refreshToken: string | null): void;
|
|
47
|
+
clear(): void;
|
|
48
|
+
}
|
|
49
|
+
|
|
50
|
+
type Environment = "production" | "test" | "local";
|
|
51
|
+
declare const ENVIRONMENT_BASE_URLS: Record<Environment, string>;
|
|
52
|
+
type FetchLike = typeof fetch;
|
|
53
|
+
interface ClientOptions {
|
|
54
|
+
/** Named environment preset. Ignored when `baseUrl` is provided. Default: `production`. */
|
|
55
|
+
environment?: Environment;
|
|
56
|
+
/** Explicit base URL (e.g. `https://api.bulutklinik.com/api/v3`). Overrides `environment`. */
|
|
57
|
+
baseUrl?: string;
|
|
58
|
+
/** Default `lang` header. Default: `tr`. */
|
|
59
|
+
lang?: Lang;
|
|
60
|
+
/** OAuth client id — used by `auth.connect` and for token refresh. */
|
|
61
|
+
clientId?: string;
|
|
62
|
+
/** OAuth client secret — used by `auth.connect` and for token refresh. */
|
|
63
|
+
clientSecret?: string;
|
|
64
|
+
/** Bearer token for the partner (`teusan`) endpoint. */
|
|
65
|
+
partnerToken?: string;
|
|
66
|
+
/** Pluggable token persistence. Default: in-memory. */
|
|
67
|
+
tokenStore?: TokenStore;
|
|
68
|
+
/** Per-request timeout in milliseconds. Default: 30000. */
|
|
69
|
+
timeoutMs?: number;
|
|
70
|
+
/** Injectable fetch implementation. Default: global `fetch`. */
|
|
71
|
+
fetch?: FetchLike;
|
|
72
|
+
}
|
|
73
|
+
interface ResolvedConfig {
|
|
74
|
+
baseUrl: string;
|
|
75
|
+
lang: Lang;
|
|
76
|
+
clientId?: string;
|
|
77
|
+
clientSecret?: string;
|
|
78
|
+
partnerToken?: string;
|
|
79
|
+
tokenStore: TokenStore;
|
|
80
|
+
timeoutMs: number;
|
|
81
|
+
fetchImpl: FetchLike;
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
type AuthMode = "public" | "bearer" | "partner";
|
|
85
|
+
interface RequestSpec {
|
|
86
|
+
method: "GET" | "POST" | "PUT" | "DELETE";
|
|
87
|
+
path: string;
|
|
88
|
+
auth: AuthMode;
|
|
89
|
+
body?: unknown;
|
|
90
|
+
lang?: Lang;
|
|
91
|
+
}
|
|
92
|
+
/**
|
|
93
|
+
* Low-level transport. Builds requests, unwraps the response envelope, maps
|
|
94
|
+
* failures to typed errors, and performs a single silent token refresh + retry
|
|
95
|
+
* on a 401 / `resultType 4`. Concurrent refreshes share one in-flight promise.
|
|
96
|
+
*/
|
|
97
|
+
declare class HttpClient {
|
|
98
|
+
readonly tokenStore: TokenStore;
|
|
99
|
+
readonly clientId: string | undefined;
|
|
100
|
+
readonly clientSecret: string | undefined;
|
|
101
|
+
private readonly baseUrl;
|
|
102
|
+
private readonly lang;
|
|
103
|
+
private readonly partnerToken;
|
|
104
|
+
private readonly timeoutMs;
|
|
105
|
+
private readonly fetchImpl;
|
|
106
|
+
private refreshInFlight;
|
|
107
|
+
constructor(config: ResolvedConfig);
|
|
108
|
+
request<T>(spec: RequestSpec): Promise<T>;
|
|
109
|
+
/** Force a token refresh using the stored refresh token. Throws on failure. */
|
|
110
|
+
refresh(): Promise<void>;
|
|
111
|
+
private send;
|
|
112
|
+
private dispatch;
|
|
113
|
+
private readEnvelope;
|
|
114
|
+
private ensureRefreshed;
|
|
115
|
+
private performRefresh;
|
|
116
|
+
private toError;
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
type LoginMode = "email" | "identity" | "phone" | "user_id" | "social" | "afterRegister";
|
|
120
|
+
interface ConnectInput {
|
|
121
|
+
apiUserName: string;
|
|
122
|
+
/** Required except `social` / `afterRegister` modes. */
|
|
123
|
+
apiUserPassword?: string;
|
|
124
|
+
loginMode: LoginMode;
|
|
125
|
+
/** Defaults to the client's configured `clientId`. */
|
|
126
|
+
clientId?: string;
|
|
127
|
+
/** Defaults to the client's configured `clientSecret`. */
|
|
128
|
+
clientSecret?: string;
|
|
129
|
+
/** Some installs require this in `phone` mode. */
|
|
130
|
+
withPhoneNumber?: string;
|
|
131
|
+
}
|
|
132
|
+
interface LoginData {
|
|
133
|
+
access_token?: string;
|
|
134
|
+
refresh_token?: string;
|
|
135
|
+
password_policy?: unknown;
|
|
136
|
+
/** Present (instead of tokens) when 2FA is required — an encrypted blob. */
|
|
137
|
+
response?: string;
|
|
138
|
+
}
|
|
139
|
+
type LoginResult = {
|
|
140
|
+
twoFactorRequired: false;
|
|
141
|
+
passwordPolicy?: unknown;
|
|
142
|
+
} | {
|
|
143
|
+
twoFactorRequired: true;
|
|
144
|
+
twoFactorResponse: string;
|
|
145
|
+
};
|
|
146
|
+
interface TwoFactorInput {
|
|
147
|
+
smsVerificationCode: string;
|
|
148
|
+
/** The encrypted blob from `connect`'s 2FA challenge (`twoFactorResponse`). */
|
|
149
|
+
response: string;
|
|
150
|
+
}
|
|
151
|
+
interface RegisterInput {
|
|
152
|
+
name: string;
|
|
153
|
+
surname: string;
|
|
154
|
+
/** Should equal `phoneNumber` (the `+CC` form) — used as the afterRegister username. */
|
|
155
|
+
apiUserName: string;
|
|
156
|
+
/** Must start with `+` and country code, e.g. `+90 555 111 22 33`. */
|
|
157
|
+
phoneNumber: string;
|
|
158
|
+
password: string;
|
|
159
|
+
smsVerificationCode: string;
|
|
160
|
+
/** Encrypted blob from the prior SMS-verification step. */
|
|
161
|
+
response: string;
|
|
162
|
+
acceptUserAgreement?: 0 | 1;
|
|
163
|
+
clientId?: string;
|
|
164
|
+
clientSecret?: string;
|
|
165
|
+
}
|
|
166
|
+
type DoctorListType = "interview" | "appointment";
|
|
167
|
+
interface QuickSearchInput {
|
|
168
|
+
searchText: string;
|
|
169
|
+
listType?: DoctorListType | null;
|
|
170
|
+
location?: string | null;
|
|
171
|
+
}
|
|
172
|
+
interface QuickSearchResult {
|
|
173
|
+
searchedBranches?: unknown[];
|
|
174
|
+
searchedDoctors?: unknown[];
|
|
175
|
+
searchedCompanies?: unknown[];
|
|
176
|
+
searchedGivenTreatments?: unknown[];
|
|
177
|
+
searchedBlogs?: unknown[];
|
|
178
|
+
queryText?: string;
|
|
179
|
+
[k: string]: unknown;
|
|
180
|
+
}
|
|
181
|
+
interface SearchParams {
|
|
182
|
+
withFreeText?: string;
|
|
183
|
+
withDoctorName?: string;
|
|
184
|
+
withBranchName?: string;
|
|
185
|
+
/** `-1` excludes psychology/diet. */
|
|
186
|
+
withBranchId?: number | null;
|
|
187
|
+
withLocationName?: string;
|
|
188
|
+
withLocationId?: number | null;
|
|
189
|
+
withCompanyName?: string;
|
|
190
|
+
withCompanyId?: number | null;
|
|
191
|
+
withGivenTreatments?: string;
|
|
192
|
+
withExpertyId?: number | null;
|
|
193
|
+
withInstitutionId?: number | null;
|
|
194
|
+
withNearestSlotDayRange?: number | null;
|
|
195
|
+
}
|
|
196
|
+
type OrderParam = "name" | "point" | "slot" | "order";
|
|
197
|
+
type OtherParam = "isKizilay" | "isQuestionable" | "isInterviewable" | "isAppointmentable";
|
|
198
|
+
interface DoctorSearchInput {
|
|
199
|
+
searchParams?: SearchParams;
|
|
200
|
+
orderParams?: OrderParam[];
|
|
201
|
+
otherParams?: OtherParam[];
|
|
202
|
+
/** >= 1. */
|
|
203
|
+
currentPage: number;
|
|
204
|
+
/** 10–100. Default 20. */
|
|
205
|
+
perPageLimit?: number;
|
|
206
|
+
}
|
|
207
|
+
interface DoctorSummary {
|
|
208
|
+
doctor_id: number;
|
|
209
|
+
name?: string;
|
|
210
|
+
surname?: string;
|
|
211
|
+
branch_name?: string;
|
|
212
|
+
star_rate?: number;
|
|
213
|
+
nearest_slot?: string | null;
|
|
214
|
+
isInterviewable?: boolean;
|
|
215
|
+
isAppointmentable?: boolean;
|
|
216
|
+
url?: string;
|
|
217
|
+
user_image?: string;
|
|
218
|
+
[k: string]: unknown;
|
|
219
|
+
}
|
|
220
|
+
interface DoctorSearchResult {
|
|
221
|
+
foundDoctorsCount: number;
|
|
222
|
+
foundDoctors: DoctorSummary[];
|
|
223
|
+
[k: string]: unknown;
|
|
224
|
+
}
|
|
225
|
+
interface Branch {
|
|
226
|
+
sysbrnch_id?: number;
|
|
227
|
+
branch_name?: string;
|
|
228
|
+
[k: string]: unknown;
|
|
229
|
+
}
|
|
230
|
+
interface Location {
|
|
231
|
+
location_id?: number;
|
|
232
|
+
[k: string]: unknown;
|
|
233
|
+
}
|
|
234
|
+
type DoctorDetail = Record<string, unknown>;
|
|
235
|
+
interface SchedulerInput {
|
|
236
|
+
doctorId: number | string;
|
|
237
|
+
/** `Y-m-d`, today..+21. When omitted, `scheduleStep` + `schedulePage` page the window. */
|
|
238
|
+
scheduleDate?: string | null;
|
|
239
|
+
scheduleStep?: number | string;
|
|
240
|
+
schedulePage?: number | string;
|
|
241
|
+
/** `interview` → online slots; anything else → physical. */
|
|
242
|
+
listType: DoctorListType;
|
|
243
|
+
}
|
|
244
|
+
interface Slot {
|
|
245
|
+
slotId: number;
|
|
246
|
+
/** `HH:mm:ss`. */
|
|
247
|
+
slotStart: string;
|
|
248
|
+
/** `HH:mm:ss`. */
|
|
249
|
+
slotEnd: string;
|
|
250
|
+
available: boolean;
|
|
251
|
+
}
|
|
252
|
+
/** Date-keyed (`Y-m-d`) map → slots for that day. Empty days are `[]`. */
|
|
253
|
+
type SchedulerResult = Record<string, Slot[]>;
|
|
254
|
+
type AppointmentType = "interview" | "appointment";
|
|
255
|
+
interface ReserveInterviewInput {
|
|
256
|
+
doctorId: number | string;
|
|
257
|
+
/** `Y-m-d H:i`, today..+21. */
|
|
258
|
+
appointmentDate: string;
|
|
259
|
+
appointmentType?: AppointmentType;
|
|
260
|
+
}
|
|
261
|
+
interface PhysicalAppointmentInput {
|
|
262
|
+
doctorId: number | string;
|
|
263
|
+
/** `Y-m-d H:i`. */
|
|
264
|
+
appointmentDate: string;
|
|
265
|
+
}
|
|
266
|
+
type DiscountCheckType = "question" | "appointment" | "lab" | "special" | "physicallyAppointment" | "tmcLab" | "program";
|
|
267
|
+
interface DiscountCheckInput {
|
|
268
|
+
checkType: DiscountCheckType;
|
|
269
|
+
discountCode: string;
|
|
270
|
+
/** Required except `lab` / `tmcLab` / `program`. */
|
|
271
|
+
doctorId?: number | string;
|
|
272
|
+
orderId?: number | string;
|
|
273
|
+
specialServiceId?: number | string;
|
|
274
|
+
programSlug?: string;
|
|
275
|
+
}
|
|
276
|
+
type DiscountResult = Record<string, unknown>;
|
|
277
|
+
interface CardInfo {
|
|
278
|
+
cardHolder: string;
|
|
279
|
+
cardNumber: string;
|
|
280
|
+
/** `m`. */
|
|
281
|
+
cardExpMonth: string;
|
|
282
|
+
/** `Y`. */
|
|
283
|
+
cardExpYear: string;
|
|
284
|
+
cardCvv: string;
|
|
285
|
+
}
|
|
286
|
+
interface SavedCard {
|
|
287
|
+
id: number;
|
|
288
|
+
card_holder_name?: string;
|
|
289
|
+
/** Masked. */
|
|
290
|
+
card_number?: string;
|
|
291
|
+
card_type?: string;
|
|
292
|
+
created_at?: string;
|
|
293
|
+
[k: string]: unknown;
|
|
294
|
+
}
|
|
295
|
+
interface PaymentInput {
|
|
296
|
+
doctorId: number | string;
|
|
297
|
+
/** `Y-m-d H:i`. */
|
|
298
|
+
appointmentDate: string;
|
|
299
|
+
appointmentType?: AppointmentType;
|
|
300
|
+
is3D: boolean;
|
|
301
|
+
termsAccept: boolean;
|
|
302
|
+
/** A new card (all-or-none) … */
|
|
303
|
+
cardInfo?: CardInfo;
|
|
304
|
+
/** … or a saved card id (from `getCards`). */
|
|
305
|
+
cardId?: number | string;
|
|
306
|
+
/** `1` tokenizes the card. */
|
|
307
|
+
saveCard?: 0 | 1;
|
|
308
|
+
discountCode?: string;
|
|
309
|
+
/** Opaque encrypted blob, passed through verbatim. */
|
|
310
|
+
caseDetail?: string;
|
|
311
|
+
}
|
|
312
|
+
/** On 3DS success, `payment3DUrl` is a browser URL to open. */
|
|
313
|
+
interface PaymentResult {
|
|
314
|
+
payment3DUrl?: string;
|
|
315
|
+
[k: string]: unknown;
|
|
316
|
+
}
|
|
317
|
+
type MeasureType = "tension" | "glucose" | "pulse" | "fever" | "weight" | "length" | "waist" | "hip" | "fat" | "muscle" | "calorie" | "step" | "sleep";
|
|
318
|
+
/** 1=day, 2=week, 3=month, 4=year. */
|
|
319
|
+
type GraphPeriod = 1 | 2 | 3 | 4;
|
|
320
|
+
/** A single measurement. `date_time` is `Y-m-d H:i`; other fields depend on `type`. */
|
|
321
|
+
interface MeasureRecord {
|
|
322
|
+
type: MeasureType;
|
|
323
|
+
date_time: string;
|
|
324
|
+
[field: string]: string | number;
|
|
325
|
+
}
|
|
326
|
+
/** Fields for the single-type endpoints (`date_time` + the type's own fields). */
|
|
327
|
+
interface MeasureFields {
|
|
328
|
+
date_time: string;
|
|
329
|
+
[field: string]: string | number;
|
|
330
|
+
}
|
|
331
|
+
interface PartnerHealthInput {
|
|
332
|
+
identity?: string;
|
|
333
|
+
phoneNumber?: string;
|
|
334
|
+
data: MeasureRecord[];
|
|
335
|
+
}
|
|
336
|
+
|
|
337
|
+
/** Online reservation, physical appointment and cancellation. */
|
|
338
|
+
declare class AppointmentsResource {
|
|
339
|
+
private readonly http;
|
|
340
|
+
constructor(http: HttpClient);
|
|
341
|
+
/** Reserve an online (interview) slot. Resolves to `null` on success. */
|
|
342
|
+
reserveInterview(input: ReserveInterviewInput): Promise<null>;
|
|
343
|
+
/** Create a physical appointment. */
|
|
344
|
+
addPhysical(input: PhysicalAppointmentInput): Promise<unknown>;
|
|
345
|
+
/** Cancel an appointment by event id (`cln_events.id`). */
|
|
346
|
+
cancel(eventId: number | string): Promise<unknown>;
|
|
347
|
+
}
|
|
348
|
+
|
|
349
|
+
/** Login, 2FA, token refresh, registration and logout. */
|
|
350
|
+
declare class AuthResource {
|
|
351
|
+
private readonly http;
|
|
352
|
+
constructor(http: HttpClient);
|
|
353
|
+
/**
|
|
354
|
+
* Log in. On success tokens are stored automatically and
|
|
355
|
+
* `{ twoFactorRequired: false }` is returned. If 2FA is enabled the result is
|
|
356
|
+
* `{ twoFactorRequired: true, twoFactorResponse }` — pass that blob to
|
|
357
|
+
* {@link connectWithTwoFactor} together with the SMS code.
|
|
358
|
+
*/
|
|
359
|
+
connect(input: ConnectInput): Promise<LoginResult>;
|
|
360
|
+
/** Complete a 2FA login with the SMS code and the challenge blob. */
|
|
361
|
+
connectWithTwoFactor(input: TwoFactorInput): Promise<void>;
|
|
362
|
+
/** Register a new patient (afterRegister auto-login). Stores tokens on success. */
|
|
363
|
+
register(input: RegisterInput): Promise<void>;
|
|
364
|
+
/** Manually refresh the access token using the stored refresh token. */
|
|
365
|
+
refresh(): Promise<void>;
|
|
366
|
+
/** Revoke the current tokens server-side and clear the local token store. */
|
|
367
|
+
disconnect(): Promise<void>;
|
|
368
|
+
private storeTokens;
|
|
369
|
+
}
|
|
370
|
+
|
|
371
|
+
/** Branches, locations, quick/filtered doctor search and doctor detail. */
|
|
372
|
+
declare class DoctorsResource {
|
|
373
|
+
private readonly http;
|
|
374
|
+
constructor(http: HttpClient);
|
|
375
|
+
branches(): Promise<Branch[]>;
|
|
376
|
+
locations(): Promise<Location[]>;
|
|
377
|
+
quickSearch(input: QuickSearchInput): Promise<QuickSearchResult>;
|
|
378
|
+
search(input: DoctorSearchInput): Promise<DoctorSearchResult>;
|
|
379
|
+
detail(id: number | string, corporate?: number | string): Promise<DoctorDetail>;
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
/** Health measurements: CRUD, latest, history list, graph and partner submission. */
|
|
383
|
+
declare class MeasuresResource {
|
|
384
|
+
private readonly http;
|
|
385
|
+
constructor(http: HttpClient);
|
|
386
|
+
/** Submit multiple measurements of any types in one call (primary entrypoint). */
|
|
387
|
+
addList(records: MeasureRecord[]): Promise<unknown>;
|
|
388
|
+
/** Submit a single measurement of one type. */
|
|
389
|
+
add(type: MeasureType, fields: MeasureFields): Promise<unknown>;
|
|
390
|
+
update(type: MeasureType, input: {
|
|
391
|
+
id: number | string;
|
|
392
|
+
} & MeasureFields): Promise<unknown>;
|
|
393
|
+
delete(type: MeasureType, id: number | string): Promise<unknown>;
|
|
394
|
+
/** Latest value of each measurement type. */
|
|
395
|
+
last(): Promise<Record<string, unknown>>;
|
|
396
|
+
/** Paginated history for one type. `glucoseType` (0/1) applies only to glucose. */
|
|
397
|
+
list(type: MeasureType, page: number | string, glucoseType?: 0 | 1): Promise<unknown>;
|
|
398
|
+
/** Grouped graph data. `period`: 1=day, 2=week, 3=month, 4=year. */
|
|
399
|
+
graph(type: MeasureType, period: GraphPeriod, page: number | string, glucoseType?: 0 | 1): Promise<unknown>;
|
|
400
|
+
/** Partner (teusan) submission — uses the configured partner token. */
|
|
401
|
+
partnerHealthInformation(input: PartnerHealthInput): Promise<unknown>;
|
|
402
|
+
}
|
|
403
|
+
|
|
404
|
+
/** Discount check, saved cards and the 3DS payment entrypoint. */
|
|
405
|
+
declare class PaymentsResource {
|
|
406
|
+
private readonly http;
|
|
407
|
+
constructor(http: HttpClient);
|
|
408
|
+
/** Validate a discount code. Note: this endpoint lives under the `patients` prefix. */
|
|
409
|
+
checkDiscountCode(input: DiscountCheckInput): Promise<DiscountResult>;
|
|
410
|
+
getCards(): Promise<{
|
|
411
|
+
cards: SavedCard[];
|
|
412
|
+
}>;
|
|
413
|
+
saveCard(card: CardInfo): Promise<unknown>;
|
|
414
|
+
/**
|
|
415
|
+
* Start an appointment payment. The amount is computed server-side. On a 3DS
|
|
416
|
+
* flow the result carries `payment3DUrl` — a browser URL to open; the SDK does
|
|
417
|
+
* not follow it. 3DS capture happens via the bank → server callback.
|
|
418
|
+
*/
|
|
419
|
+
pay(input: PaymentInput): Promise<PaymentResult>;
|
|
420
|
+
deleteCard(cardId: number | string): Promise<unknown>;
|
|
421
|
+
}
|
|
422
|
+
|
|
423
|
+
/** Doctor availability (materialized slots). */
|
|
424
|
+
declare class SlotsResource {
|
|
425
|
+
private readonly http;
|
|
426
|
+
constructor(http: HttpClient);
|
|
427
|
+
/**
|
|
428
|
+
* Fetch a doctor's free slots. Returns a date-keyed map of slots. Build the
|
|
429
|
+
* next step's `appointmentDate` as `"<date> <slotStart>"` (drop the seconds).
|
|
430
|
+
*/
|
|
431
|
+
schedule(input: SchedulerInput): Promise<SchedulerResult>;
|
|
432
|
+
}
|
|
433
|
+
|
|
434
|
+
/**
|
|
435
|
+
* The Bulutklinik API client. Construct once and reuse; service groups are
|
|
436
|
+
* exposed as properties.
|
|
437
|
+
*
|
|
438
|
+
* @example
|
|
439
|
+
* ```ts
|
|
440
|
+
* const client = new BulutklinikClient({
|
|
441
|
+
* environment: "test",
|
|
442
|
+
* clientId: "…",
|
|
443
|
+
* clientSecret: "…",
|
|
444
|
+
* });
|
|
445
|
+
* await client.auth.connect({ apiUserName: "…", apiUserPassword: "…", loginMode: "email" });
|
|
446
|
+
* const result = await client.doctors.quickSearch({ searchText: "kardiyo" });
|
|
447
|
+
* ```
|
|
448
|
+
*/
|
|
449
|
+
declare class BulutklinikClient {
|
|
450
|
+
readonly auth: AuthResource;
|
|
451
|
+
readonly doctors: DoctorsResource;
|
|
452
|
+
readonly slots: SlotsResource;
|
|
453
|
+
readonly appointments: AppointmentsResource;
|
|
454
|
+
readonly payments: PaymentsResource;
|
|
455
|
+
readonly measures: MeasuresResource;
|
|
456
|
+
/** The active token store (also accepts a custom one via options). */
|
|
457
|
+
readonly tokenStore: TokenStore;
|
|
458
|
+
private readonly http;
|
|
459
|
+
constructor(options?: ClientOptions);
|
|
460
|
+
}
|
|
461
|
+
|
|
462
|
+
interface ApiErrorContext {
|
|
463
|
+
httpStatus: number;
|
|
464
|
+
resultType?: number;
|
|
465
|
+
errorType?: string | number;
|
|
466
|
+
data?: unknown;
|
|
467
|
+
method: string;
|
|
468
|
+
path: string;
|
|
469
|
+
retryAfter?: number;
|
|
470
|
+
}
|
|
471
|
+
/** Base class for every error thrown by the SDK. */
|
|
472
|
+
declare class BulutklinikError extends Error {
|
|
473
|
+
constructor(message: string, options?: {
|
|
474
|
+
cause?: unknown;
|
|
475
|
+
});
|
|
476
|
+
}
|
|
477
|
+
/** Network failure, timeout, DNS or TLS error — no HTTP response was received. */
|
|
478
|
+
declare class TransportError extends BulutklinikError {
|
|
479
|
+
constructor(message: string, cause?: unknown);
|
|
480
|
+
}
|
|
481
|
+
/** An HTTP response was received but the call was not successful. */
|
|
482
|
+
declare class ApiError extends BulutklinikError {
|
|
483
|
+
readonly httpStatus: number;
|
|
484
|
+
readonly resultType: number | undefined;
|
|
485
|
+
readonly errorType: string | number | undefined;
|
|
486
|
+
readonly data: unknown;
|
|
487
|
+
readonly method: string;
|
|
488
|
+
readonly path: string;
|
|
489
|
+
constructor(message: string, ctx: ApiErrorContext);
|
|
490
|
+
}
|
|
491
|
+
/** 422 / errorType=validation. */
|
|
492
|
+
declare class ValidationError extends ApiError {
|
|
493
|
+
}
|
|
494
|
+
/** 401, a logout (resultType 2), or a failed token refresh. */
|
|
495
|
+
declare class AuthenticationError extends ApiError {
|
|
496
|
+
}
|
|
497
|
+
/** 403 — authenticated but not permitted / out of scope. */
|
|
498
|
+
declare class AuthorizationError extends ApiError {
|
|
499
|
+
}
|
|
500
|
+
/** 404. */
|
|
501
|
+
declare class NotFoundError extends ApiError {
|
|
502
|
+
}
|
|
503
|
+
/** 429 — throttled. Carries `retryAfter` (seconds) when the header is present. */
|
|
504
|
+
declare class RateLimitError extends ApiError {
|
|
505
|
+
readonly retryAfter: number | undefined;
|
|
506
|
+
constructor(message: string, ctx: ApiErrorContext);
|
|
507
|
+
}
|
|
508
|
+
|
|
509
|
+
export { ApiError, type AppointmentType, AppointmentsResource, AuthResource, AuthenticationError, AuthorizationError, type Branch, BulutklinikClient, BulutklinikError, type CardInfo, type ClientOptions, type ConnectInput, type DiscountCheckInput, type DiscountCheckType, type DiscountResult, type DoctorDetail, type DoctorListType, type DoctorSearchInput, type DoctorSearchResult, type DoctorSummary, DoctorsResource, ENVIRONMENT_BASE_URLS, type Envelope, type Environment, type FetchLike, type GraphPeriod, type Lang, type Location, type LoginData, type LoginMode, type LoginResult, type MeasureFields, type MeasureRecord, type MeasureType, MeasuresResource, MemoryTokenStore, NotFoundError, type OrderParam, type OtherParam, type PartnerHealthInput, type PaymentInput, type PaymentResult, PaymentsResource, type PhysicalAppointmentInput, type QuickSearchInput, type QuickSearchResult, RateLimitError, type RegisterInput, type ReserveInterviewInput, ResultType, type ResultTypeValue, type SavedCard, type SchedulerInput, type SchedulerResult, type SearchParams, type Slot, SlotsResource, type TokenStore, TransportError, type TwoFactorInput, ValidationError };
|