diff --git a/packages/api-client-core/src/AnyModelManager.ts b/packages/api-client-core/src/AnyModelManager.ts index 114d6520d..8b7ad7313 100644 --- a/packages/api-client-core/src/AnyModelManager.ts +++ b/packages/api-client-core/src/AnyModelManager.ts @@ -59,3 +59,11 @@ export interface AnyLegacyModelManager { * Any model manager, either public or internal */ export type AnyModelManager = AnyPublicModelManager | AnyPublicSingletonModelManager | AnyLegacyModelManager | InternalModelManager; + +export function isPublicModelManager(manager: AnyModelManager): manager is AnyPublicModelManager { + return "findOne" in manager; +} + +export function isPublicSingletonModelManager(manager: AnyModelManager): manager is AnyPublicSingletonModelManager { + return "get" in manager; +} diff --git a/packages/api-client-core/src/GadgetRecord.ts b/packages/api-client-core/src/GadgetRecord.ts index ec57cde01..19ff9e35c 100644 --- a/packages/api-client-core/src/GadgetRecord.ts +++ b/packages/api-client-core/src/GadgetRecord.ts @@ -1,6 +1,6 @@ import { klona as cloneDeep } from "klona"; import type { Jsonify } from "type-fest"; -import type { AnyModelManager } from "./AnyModelManager.js"; +import { isPublicModelManager, isPublicSingletonModelManager, type AnyModelManager } from "./AnyModelManager.js"; import { isEqual, toPrimitiveObject } from "./support.js"; export enum ChangeTracking { @@ -212,6 +212,24 @@ export class GadgetRecord_ { touch(): void { this[kTouched] = true; } + + async reload() { + const modelManager = this[kModelManager]; + + if (!modelManager) { + throw new Error("Record can not be reloaded"); + } + + if (isPublicModelManager(modelManager)) { + return await modelManager.findOne(this.getField("id")); + } + + if (isPublicSingletonModelManager(modelManager)) { + return await modelManager.get(); + } + + throw new Error("Record can not be reloaded"); + } } /**