권한과 조직을 지정하여 프로젝트 생성(Create Project) (V2)
대상 공간에 새 프로젝트를 만듭니다. 표시 이름은 공간 안에서 고유해야 하며 . 또는 .. 자체일 수 없고 /를 포함할 수 없습니다. 최대 길이는 700자입니다.
OAuth2 타사 애플리케이션으로 이 엔드포인트를 호출할 때는 Ontology SDK와 연결된 애플리케이션을 사용할 수 없습니다. OSDK 연결은 작업 범위를 지정한 프로젝트로 제한하기 때문입니다. 애플리케이션 생성의 Resources 페이지에서 No, I won't use an Ontology SDK를 선택합니다.
생성한 프로젝트를 관리할 주체가 있어야 합니다. 소유자에 준하는 역할은 compass:edit-project 작업을 포함해야 하며, 기본 역할 집합에서는 일반적으로 compass:manage가 해당합니다. 지정할 조직의 표지도 상위 공간에 적용되어 있어야 합니다.
HTTP 요청
POST /api/v2/filesystem/projects/create
작업 식별자는 v2.createProject입니다. OAuth2로 호출하는 타사 애플리케이션에는 api:filesystem-write 권한 범위가 필요합니다. 각 요청에 Authorization: Bearer <접근 토큰>을 전달합니다.
경로 매개변수
지정할 경로 매개변수가 없습니다.
쿼리 매개변수
지정할 쿼리 매개변수가 없습니다.
요청 본문
CreateProjectRequest 본문은 필수입니다. roleGrants의 키는 역할 ID이며 값은 principalId와 principalType을 가진 주체 객체들의 배열입니다. 주체 유형은 USER 또는 GROUP입니다. 리소스 역할 변경 API의 principalIdOnly 형태와 구분합니다.
defaultRoles는 조직과 표지 요구조건을 충족한 사용자에게 자동 적용하는 역할 목록이므로 명시적인 관리 그룹의 역할과 각각 검토합니다. resourceLevelRoleGrantsAllowed를 생략하면 이 API의 기본값 true가 적용됩니다. 개별 리소스의 직접 역할 부여를 허용하지 않으려면 false를 명시합니다.
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
displayName | string | 필수 | 리소스의 표시 이름입니다. | |
description | string | 선택 | ||
spaceRid | string | 필수 | 공간의 고유 식별자(RID)입니다. | ri.compass.main.folder.a86ad5f5-3db5-48e4-9fdd-00aa3e5731ca |
roleGrants | map<RoleId, array> | 선택 | ||
defaultRoles | list<RoleId> | 선택 | ||
organizationRids | list<OrganizationRid> | 선택 | ||
resourceLevelRoleGrantsAllowed | boolean | 선택 | 프로젝트 안의 개별 리소스에 역할 부여를 허용할지 정합니다. 이 API 입력에서 생략하면 기본값은 true입니다. |
roleGrants의 구조
맵의 키는 RoleId(string), 값은 array(list<PrincipalWithId>)입니다.
키: 역할의 고유 ID입니다. 역할은 리소스 접근 수준을 정하는 권한 집합입니다. Foundry의 기본 리소스 역할에는 Owner, Editor, Viewer, Discoverer가 있으며, 이 요청에는 대상 리소스에 유효한 실제 역할 ID를 사용합니다.
배열 항목은 PrincipalWithId이며 자료형은 object입니다.
ID가 있는 사용자 또는 그룹 주체입니다.
| 이름 | 자료형 | 필수 여부 | 의미와 조건 | 예시 값 |
|---|---|---|---|---|
principalId | string | 필수 | Foundry 그룹 또는 사용자의 ID입니다. | f05f8da4-b84c-4fca-9c77-8af0b13d11de |
principalType | enum | 필수 | 허용값: USER, GROUP. | GROUP |
defaultRoles의 구조
배열 항목은 RoleId이며 자료형은 string입니다.
역할의 고유 ID입니다. 역할은 리소스 접근 수준을 정하는 권한 집합입니다. Foundry의 기본 리소스 역할에는 Owner, Editor, Viewer, Discoverer가 있으며, 이 요청에는 대상 리소스에 유효한 실제 역할 ID를 사용합니다.
organizationRids의 구조
배열 항목은 OrganizationRid이며 자료형은 string입니다.
다음 본문의 식별자와 값은 가상 예시입니다.
{
"organizationRids": [
"ri.multipass..organization.c30ee6ad-b5e4-4afe-a74f-fe4a289f2faa"
],
"displayName": "My Important Project",
"defaultRoles": [
"8bf49052-dc37-4528-8bf0-b551cfb71268"
],
"description": "project description",
"roleGrants": {
"8bf49052-dc37-4528-8bf0-b551cfb71268": [
{
"principalId": "f05f8da4-b84c-4fca-9c77-8af0b13d11de",
"principalType": "GROUP"
}
]
},
"spaceRid": "ri.compass.main.folder.a86ad5f5-3db5-48e4-9fdd-00aa3e5731ca"
}
응답
응답 형식은 Project입니다.
Project의 12개 필드와 개별 리소스 역할 허용 여부는 Project 자료형을 따릅니다.
가상 항공사 프로젝트를 생성했을 때의 응답 예시입니다.
{
"path": "/Empyrean Airlines/My Important Project",
"updatedTime": "2024-09-25T17:29:35.974Z",
"updatedBy": "f05f8da4-b84c-4fca-9c77-8af0b13d11de",
"createdBy": "f05f8da4-b84c-4fca-9c77-8af0b13d11de",
"displayName": "My Important Project",
"resourceLevelRoleGrantsAllowed": true,
"description": "project description",
"createdTime": "2024-09-25T17:29:35.974Z",
"rid": "ri.compass.main.folder.01a79a9d-e293-48db-a585-9ffe221536e8",
"spaceRid": "ri.compass.main.folder.a86ad5f5-3db5-48e4-9fdd-00aa3e5731ca",
"trashStatus": "NOT_TRASHED"
}
개별 오류
| 오류 이름 | 오류 코드 | HTTP | 의미와 조건 | 추가 매개변수 |
|---|---|---|---|---|
ProjectCreationNotSupported | INVALID_ARGUMENT | 400 | 현재 사용자의 공간에서는 프로젝트 생성을 지원하지 않습니다. | spaceRid |
ProjectNameAlreadyExists | CONFLICT | 409 | 같은 공간의 다른 프로젝트가 요청한 표시 이름을 이미 사용하고 있습니다. | displayName, spaceRid |
InvalidDisplayName | INVALID_ARGUMENT | 400 | 표시 이름은 . 또는 .. 자체일 수 없고 /를 포함할 수 없으며 길이는 700자 이하여야 합니다. | displayName |
OrganizationsNotFound | NOT_FOUND | 404 | 지정한 조직 RID 중 하나 이상을 찾을 수 없습니다. | organizationRids |
InvalidRoleIds | INVALID_ARGUMENT | 400 | 기본 역할이나 역할 부여에서 참조한 ID가 해당 공간의 프로젝트 역할 집합에 없습니다. | requestedRoleIds |
CreateProjectNoOwnerLikeRoleGrant | INVALID_ARGUMENT | 400 | 어떤 주체에게도 소유자에 준하는 역할을 부여하지 않아 관리 권한이 없는 프로젝트가 됩니다. 소유자에 준하는 역할은 compass:edit-project 작업을 포함하는 역할이며, 기본 역할 집합에서는 일반적으로 compass:manage 역할입니다. | grantedRoleIds, roleSetOwnerLikeRoleIds |
OrganizationMarkingNotOnSpace | INVALID_ARGUMENT | 400 | 지정한 조직의 조직 표지 중 하나 이상이 대상 공간에 적용되어 있지 않습니다. | spaceRid, organizationRids |
CreateProjectPermissionDenied | PERMISSION_DENIED | 403 | 프로젝트를 생성할 수 없습니다. | |
ProjectNotFound | NOT_FOUND | 404 | 지정한 프로젝트를 찾을 수 없습니다. | projectRid |
SpaceNotFound | NOT_FOUND | 404 | 지정한 공간을 찾을 수 없습니다. | spaceRid |
요청 예제
FOUNDRY_HOST에는 https://를 제외한 Foundry 호스트를, FOUNDRY_TOKEN에는 유효한 토큰을 환경 변수로 제공합니다. 예시 식별자와 매개변수 값은 실제 작업 대상에 맞게 바꿉니다.
조직, 공간, 주체와 역할 ID는 가상 예시입니다. 같은 예시 역할 ID가 기본 역할과 명시적 부여에 쓰였지만 실제로는 두 적용 대상을 각각 검토하여 역할을 선택합니다. 기본 역할을 받는 모든 사용자에게 관리 권한까지 부여하려는 것인지 확인하고, 승인한 관리 주체가 소유자에 준하는 권한을 갖도록 구성합니다.
cURL
curl -X POST \
-H "Content-type: application/json" \
-H "Authorization: Bearer ${FOUNDRY_TOKEN}" \
"https://${FOUNDRY_HOST}/api/v2/filesystem/projects/create" \
-d '{"organizationRids":["ri.multipass..organization.c30ee6ad-b5e4-4afe-a74f-fe4a289f2faa"],"displayName":"My Important Project","defaultRoles":["8bf49052-dc37-4528-8bf0-b551cfb71268"],"description":"project description","roleGrants":{"8bf49052-dc37-4528-8bf0-b551cfb71268":[{"principalId":"f05f8da4-b84c-4fca-9c77-8af0b13d11de","principalType":"GROUP"}]},"spaceRid":"ri.compass.main.folder.a86ad5f5-3db5-48e4-9fdd-00aa3e5731ca"}'
Python
Requests 라이브러리가 설치된 Python 환경에서 사용합니다.
import os
import requests
HOSTNAME = os.environ["FOUNDRY_HOST"]
TOKEN = os.environ["FOUNDRY_TOKEN"]
headers = {
"content-type": "application/json",
"authorization": "Bearer {}".format(TOKEN)
}
request_body = {
"organizationRids": [
"ri.multipass..organization.c30ee6ad-b5e4-4afe-a74f-fe4a289f2faa"
],
"displayName": "My Important Project",
"defaultRoles": [
"8bf49052-dc37-4528-8bf0-b551cfb71268"
],
"description": "project description",
"roleGrants": {
"8bf49052-dc37-4528-8bf0-b551cfb71268": [
{
"principalId": "f05f8da4-b84c-4fca-9c77-8af0b13d11de",
"principalType": "GROUP"
}
]
},
"spaceRid": "ri.compass.main.folder.a86ad5f5-3db5-48e4-9fdd-00aa3e5731ca"
}
response = requests.post('https://{}/api/v2/filesystem/projects/create'.format(HOSTNAME), headers=headers, json=request_body)
print(response)
Java
Apache HttpClient 4.5 API와 try-with-resources를 사용합니다. 클래스 이름에 맞는 CreateProjectExample.java 파일에서 사용합니다.
import org.apache.http.client.methods.CloseableHttpResponse;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.CloseableHttpClient;
import org.apache.http.impl.client.HttpClientBuilder;
import org.apache.http.entity.ContentType;
import org.apache.http.entity.StringEntity;
public class CreateProjectExample {
public static void main(String[] args) throws Exception {
String HOSTNAME = System.getenv("FOUNDRY_HOST");
String TOKEN = System.getenv("FOUNDRY_TOKEN");
try (CloseableHttpClient httpClient = HttpClientBuilder.create().build()) {
HttpPost request = new HttpPost("https://" + HOSTNAME + "/api/v2/filesystem/projects/create");
request.addHeader("content-type", "application/json");
request.addHeader("authorization", String.format("Bearer %s", TOKEN));
request.setEntity(new StringEntity("{\"organizationRids\":[\"ri.multipass..organization.c30ee6ad-b5e4-4afe-a74f-fe4a289f2faa\"],\"displayName\":\"My Important Project\",\"defaultRoles\":[\"8bf49052-dc37-4528-8bf0-b551cfb71268\"],\"description\":\"project description\",\"roleGrants\":{\"8bf49052-dc37-4528-8bf0-b551cfb71268\":[{\"principalId\":\"f05f8da4-b84c-4fca-9c77-8af0b13d11de\",\"principalType\":\"GROUP\"}]},\"spaceRid\":\"ri.compass.main.folder.a86ad5f5-3db5-48e4-9fdd-00aa3e5731ca\"}", ContentType.APPLICATION_JSON));
try (CloseableHttpResponse response = httpClient.execute(request)) {
System.out.println(response);
}
}
}
}
JavaScript
fetch를 제공하는 Node.js 환경에서 사용합니다. 서비스 사용자 토큰을 브라우저로 전달하지 않습니다.
const HOSTNAME = process.env.FOUNDRY_HOST;
const TOKEN = process.env.FOUNDRY_TOKEN;
fetch(`https://${HOSTNAME}/api/v2/filesystem/projects/create`, {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': `Bearer ${TOKEN}`,
},
body: '{"organizationRids":["ri.multipass..organization.c30ee6ad-b5e4-4afe-a74f-fe4a289f2faa"],"displayName":"My Important Project","defaultRoles":["8bf49052-dc37-4528-8bf0-b551cfb71268"],"description":"project description","roleGrants":{"8bf49052-dc37-4528-8bf0-b551cfb71268":[{"principalId":"f05f8da4-b84c-4fca-9c77-8af0b13d11de","principalType":"GROUP"}]},"spaceRid":"ri.compass.main.folder.a86ad5f5-3db5-48e4-9fdd-00aa3e5731ca"}'
}).then((response) => {
console.log(response)
});
PowerShell
$ErrorActionPreference = 'Stop'
$TOKEN = $env:FOUNDRY_TOKEN
$HOSTNAME = $env:FOUNDRY_HOST
$headers = @{
"authorization" = "Bearer $TOKEN"
}
$response = Invoke-WebRequest -Uri "https://$HOSTNAME/api/v2/filesystem/projects/create" `
-Method Post `
-Headers $headers `
-ContentType application/json `
-Body "{`"organizationRids`":[`"ri.multipass..organization.c30ee6ad-b5e4-4afe-a74f-fe4a289f2faa`"],`"displayName`":`"My Important Project`",`"defaultRoles`":[`"8bf49052-dc37-4528-8bf0-b551cfb71268`"],`"description`":`"project description`",`"roleGrants`":{`"8bf49052-dc37-4528-8bf0-b551cfb71268`":[{`"principalId`":`"f05f8da4-b84c-4fca-9c77-8af0b13d11de`",`"principalType`":`"GROUP`"}]},`"spaceRid`":`"ri.compass.main.folder.a86ad5f5-3db5-48e4-9fdd-00aa3e5731ca`"}"
$response.content