SuperRepo에서 작업 관리 앱 확장
기본 SuperRepo 템플릿은 작업, 작업자와 작업 완료 함수를 포함합니다. 이 예제는 기존 객체 유형 가져오기, 작업 할당 관계와 완료 액션을 같은 저장소에서 연결하는 과정입니다. 먼저 SuperRepo를 생성하고 로컬 미리보기를 시작합니다.
구성 요소
루트 foundry.yml은 온톨로지, TypeScript 함수 및 앱의 위치를 정합니다.
components:
- type: ONTOLOGY
path: ./ontology
- type: TYPESCRIPT_FUNCTIONS
path: ./functions/typescript-functions
- type: APP
path: ./app
컴포넌트를 추가하거나 옮기면 이 설정과 관련 import 및 생성 SDK 위치를 함께 바꿉니다. 고급 구성의 경로 규칙을 따릅니다.
기존 유형 가져오기
foundry import ontology 명령 또는 VS Code Palantir 확장의 Import 사이드바를 사용합니다.
선택 마법사에서 사용할 객체 유형을 고릅니다. Worker는 가져오기 예제입니다.
Import to project는 선택한 유형을 Foundry 프로젝트에 가져오고 저장소에 코드화할 foundry import ontology 명령을 보여 줍니다. 이 명령도 실행해야 저장소의 lock 메타데이터와 생성 타입에 반영됩니다.
가져오기는 실제 플랫폼의 유형 메타데이터와 프로젝트 참조에 관여합니다. 로컬 seed 객체를 추가하는 것과 구분해야 합니다.
작업 할당 링크
ontology/src/ontology.mts가 온톨로지 코드 정의를 담습니다. 템플릿의 TutorialWorker와 TutorialTask는 다음 일대다 링크로 연결됩니다. 작업자 한 명에게 여러 작업을 할당하고 각 작업은 한 담당자를 가집니다.
export const assignedTasks: LinkType = defineLink({
apiName: "assignedTasks",
one: {
object: TutorialWorker,
metadata: { apiName: "assignedTasks" },
},
toMany: {
object: TutorialTask,
metadata: { apiName: "assignee" },
},
manyForeignKeyProperty: "assigneeId",
editsEnabled: true,
});
manyForeignKeyProperty의 assigneeId는 작업에 저장한 작업자 기본 키입니다. 작업자 쪽 생성 링크 이름은 assignedTasks, 작업 쪽은 assignee입니다. defineLink와 LinkType은 템플릿이 사용하는 @osdk/maker의 정의를 사용하며 기존 유형 선언 다음에 이 링크를 둡니다.
로컬에서 미할당 작업에 담당자를 넣으려면 ontology/seed/001-tasks.mts의 TASK-103에 assigneeId: "WORKER-1"을 추가합니다. 두 객체 유형의 seed는 이 파일에 있습니다.
seed 파일을 편집하면 로컬 미리보기 데이터가 초기화됩니다. 미리보기에서 만든 객체는 사라지고 수정한 seed 객체는 seed 정의로 돌아갑니다. seed 데이터는 배포되지 않습니다.
ontology.mts를 바꾸면 로컬 OSDK를 다시 생성합니다. macOS/Linux의 pnpm run dev 또는 Windows의 pnpm run dev:windows 상태 화면에서 진행을 보고 Tab과 방향키로 ontology:dev 출력을 선택할 수 있습니다.
완료 함수
SuperRepo는 현재 TypeScript v2 함수를 지원합니다. functions/typescript-functions/src/functions/completeTask.ts를 엽니다.
import { task } from "@ontology/sdk";
import { Client, Osdk } from "@osdk/client";
import { createEditBatch, Edits, UserFacingError } from "@osdk/functions";
export const COMPLETE = "Complete";
type OntologyEdit = Edits.Object<task>;
function completeTask(
client: Client,
taskToComplete: Osdk.Instance<task>,
): OntologyEdit[] {
if (taskToComplete.status === COMPLETE) {
throw new UserFacingError(
`${taskToComplete.title ?? taskToComplete.$primaryKey} is already complete`,
);
}
const batch = createEditBatch<OntologyEdit>(client);
batch.update(taskToComplete, { status: COMPLETE });
return batch.getEdits();
}
export const config = {
apiName: "completeTask",
};
export default completeTask;
task는 생성 SDK의 API 이름에서 나온 내보내기입니다. ontology.mts의 상수 이름 TutorialTask와 다릅니다. worker도 TutorialWorker 상수 대신 API 이름에 따라 생성됩니다.
상태가 이미 Complete이면 사용자 오류를 반환합니다. 그렇지 않으면 상태를 Complete로 바꾸는 편집 목록을 만듭니다. VS Code Palantir 확장의 함수 미리보기로 결과 편집을 확인할 수 있습니다.
함수가 편집 목록을 반환하는 것만으로 객체가 바뀌지는 않습니다. 적용은 함수 기반 액션을 통해 수행합니다.
함수 기반 액션
템플릿의 ontology.mts에는 completeTask를 연결하는 defineFunctionBackedAction이 있습니다.
export const completeTaskAction: ActionType = defineFunctionBackedAction({
functionApiName: "completeTask",
apiName: "complete-task-action",
});
functionApiName은 함수의 completeTask, apiName은 complete-task-action입니다. 생성 OSDK에서는 completeTaskAction으로 소비합니다.
React에서 액션 호출
기본 앱의 app/src/tutorial/Demo.tsx는 @osdk/react의 useOsdkObjects와 useOsdkAction을 이미 사용합니다. 훅은 앱 루트의 OsdkProvider가 제공하는 설정된 클라이언트가 필요하며 @osdk/api, @osdk/client와 @osdk/react 버전이 호환되어야 합니다.
import는 파일 최상위에 두고, 두 훅은 기존 Demo 컴포넌트 안에서 호출합니다.
import { task, completeTaskAction } from "@ontology/sdk";
import {
useOsdkAction,
useOsdkObjects,
} from "@osdk/react";
const { data: tasks } = useOsdkObjects(task, { pageSize: 50 });
const completeAction = useOsdkAction(completeTaskAction);
getCompleteHandler의 주석 처리된 handler를 활성화하고 기존 return null을 제거합니다. 완료된 handler는 다음과 같습니다.
function getCompleteHandler(): (taskToComplete: Osdk.Instance<task>) => Promise<void> {
return async taskToComplete => {
await completeAction.applyAction({ taskToComplete });
};
}
이 helper는 같은 Demo 컴포넌트의 completeAction을 사용합니다. 액션 입력 이름 taskToComplete는 함수 입력과 연결된 계약입니다.
미리보기 앱에서 Add your own logic을 선택한 뒤 Live preview의 미완료 작업에서 Mark as complete를 누르면 완료 액션을 실행합니다. Define object relationships는 각 작업자의 할당 작업을 보여 줍니다. 이 화면은 useLinks(item, "assignedTasks", { pageSize: 50 })로 정의한 링크를 탐색합니다.
코드, seed와 프런트엔드가 원하는 동작을 만들면 제품 배포 절차로 실제 플랫폼에 설치합니다. 로컬 미리보기에서 바꾼 객체 자체가 배포 데이터로 따라가지는 않습니다.