2014-10-10 2 views
0

이것은 아사나에 관한 다소 긴 게시물이며 API는 매우 유연하지 않으며 "왼쪽으로 쓰는 것"API이며 다른 방법으로 프로젝트를 복제 할 수있는 경우이 옵션이 유용합니다.다른 방법으로 아사나 프로젝트를 복제 할 수 있습니까?

먼저 Asana를 (를) 좋아하고 자신의 웹 사이트를 통해 작업하고 있다고 명시해야합니다. 그래서 나는 API를 제외하고는 그것에 반대하지 않거나 그것과의 싸움을하지 않는다. 아직 사용하지 않았다면 API를 통해 Asana 플랫폼을 대상으로하는 것을 작성하고 싶지 않으면 시도해야합니다. , Copy an Asana task/project

질문은 간단했다 프로젝트 또는 아사 API를 사용하여 작업 그룹을 복제 할 수 있습니다 :


나는 당신이 여기에서 찾을 수있는 프로젝트를 복제에 대해 이번 주 초에 질문을 기록했다. Agnoster의 대답은 단순히 이것이 불가능하다는 것이었지만 그것은 백 로그에 있습니다.

그래서 실제로 프로젝트를 복사하고 (아래 참조) 모든 작업과 하위 작업으로 전체 프로젝트를 다시 만드는 코드를 작성했습니다. 이것은 당신이 각 작업을 seperatly 쿼리해야하기 때문에 다소 비싼 프로세스였습니다. 즉, 10 개의 작업이 있으면 1 + 10 개의 쿼리가됩니다. 프로젝트가 10 개의 작업을 포함한다는 정보를 얻기위한 하나의 쿼리. 그런 다음 각 작업에 쿼리하여 하위 작업이 포함되었는지 확인해야했습니다. 위에 나열된 각 작업에 하나의 하위 작업이있는 경우 API 1 + 10 * 2 번을 쿼리해야합니다. 상상해보십시오. 하위 계층이 겹쳐진 계층이 많으면 결국 수백 또는 수천 개의 쿼리로 끝날 수 있습니다.

우리는 현재 프로젝트에서 50 개의 작업과 그 중 일부에 하위 수준의 하위 수준 (대략 1 + 50 + 50 요청)을 가지고 있습니다. 따라서 API에 대해 총 101 개의 검색어가 생성됩니다.

이제 아사나에서 쿼리하는 작업에 정보가 부족하다는 것을 발견했습니다.

저는 "/ projects/{project-id}/tasks"를 사용하여 각각의 모든 작업을 복제하기 위해 작업 목록을 얻습니다. 그럼 각 하위 작업을 얻기 위해이 "tasks/{task-id}/subtasks"라는 각 작업을 쿼리해야합니다. 꽤 직설적 인.

이제는 API에 문제가 있으며 여기에서 전달한 결과가 나왔습니다. 더 나은 해결책이 있기를 바랍니다.

내가이 조회 할 경우 : "/ {프로젝트 ID}/프로젝트/작업을"나는 다음과 같은 결과를 얻을 :

{ 
    "data": [ 
    { 
     "id": 1248, 
     "name": "Buy catnip" 
    }, 
    { 
     "id": 24816, 
     "name": "Reflect on role of kittens in society" 
    }, 
    { 
     ... 
    } 
    ] 
} 

사람이 문제를 여기에서 볼 수 있습니까? 즉, 나는 그저 ID와 이름을 서버와 다른 것에서 얻는다. 작업은 메모, 양수인, 만든 날짜, 만기 날짜 등으로 구성되지만 위 정보는 해당 목록에 포함되지 않으며 API 끝점 인 "tasks/{task-id}/subtasks"에서도 동일하게 적용됩니다.

그렇다면 어디에서 우리를 떠날까요? 그럼 나는 실제 작업과 관련된 정보를 얻으려면 각각의 모든 작업에 두 번째로 쿼리해야합니다. 그래서 이미 많은 양의 쿼리가 거의 두 배로 늘려 가고 있습니다. 내 1 + 50 + 50 검색어는 1 + 50 + 50 + 50 + 50이 될 것입니다. 따라서이 프로젝트를 API를 통해 복제하려면 첫 번째 프로젝트의 모든 정보를 두 번째 프로젝트로 가져 오기 위해 200 개가 넘는 쿼리가 필요하지만 기다려야합니다. 이것은 실제로 작업을 쿼리하는 데 필요한 쿼리의 수입니다. 그런 다음 새 프로젝트에서 모든 새 작업을 생성하기 위해 100 개의 다른 쿼리를 추가해야합니다.

그래서 최종 결과는 Asanas API를 통해 새 프로젝트에 복사하려는 소규모 프로젝트에서 대략 301 건의 쿼리를 수행해야한다는 것입니다. 작업에 하위 작업이 있는지 여부를 나타내는 작은 업데이트조차도 쿼리 수를 크게 줄였습니다. (예 : { "id": 1248, "name": "사기꾼 사기", "hasSubtasks": false})

내 질문에 단순한이 있습니다. 쿼리를 저장하고 성능을 향상시킬 수있는 중요한 API 끝점을 놓쳤습니까? 네,

public bool DuplicateAsanaProject(string projectId) 
    { 
     // Get the current project 
     var request = new RestRequest(string.Format("/projects/{0}", projectId), Method.GET); 
     request.RequestFormat = DataFormat.Json; 

     var asanaProject = Execute<AsanaProjectTemplate>(request); 
     if (asanaProject == null) 
      return false; 

     // Create a new project 
     var newAsanaProject = CreateAsanaProjectInTeam(asanaProject.Data.Name, asanaProject.Data.Notes, TeamProductionId); 
     // Get all the tasks in the current project 
     var tasksInProject = GetAsanaTasksForProject(asanaProject.Data.Id); 
     // Reverse all the tasks to get them outputted in the correct order 
     tasksInProject.Data.Reverse(); 
     // Loop through all project tasks 
     foreach (var task in tasksInProject.Data) 
     { 
      // Get the task from the server 
      var oldTask = GetAsanaTask(task.Id); 
      // Create the new task 
      var newTask = CreateAsanaTask(oldTask.Data.Name, oldTask.Data.Notes, newAsanaProject.Data.Id, WorkspaceId); 

      // Get the sub-tasks for this task 
      var tasksList = GetAsanaTasksForTask(task.Id); 
      // If we have some sub-tasks, then create them 
      if (tasksList != null && tasksList.Data.Count > 0) 
       CreateSubTasksForTask(newTask.Data.Id, tasksList); 
     } 
     return true;    
    } 

    /// <summary> 
    /// Create sub-tasks for a specific task 
    /// </summary> 
    /// <param name="taskId">New task id. This is the task in where the new tasks will be added</param> 
    /// <param name="tasks">List all sub-tasks</param> 
    public void CreateSubTasksForTask(string taskId, AsanaTasksTemplate tasks) 
    { 
     // Reverse all the tasks to get them outputted in the correct order 
     tasks.Data.Reverse(); 
     foreach(var task in tasks.Data) 
     { 
      // Get the task from the server 
      var oldTask = GetAsanaTask(task.Id); 
      // Create the new task 
      var newTask = CreateAsanaSubTask(oldTask.Data.Name, oldTask.Data.Notes, taskId); 

      // Get the sub-tasks for this task 
      var tasksList = GetAsanaTasksForTask(task.Id); 
      // If we have some sub-tasks, then create them 
      if (tasksList != null && tasksList.Data.Count > 0) 
       CreateSubTasksForTask(newTask.Data.Id, tasksList); 
     } 
    } 

    /// <summary> 
    /// Retrieves all sub-tasks for a specific task 
    /// </summary> 
    /// <param name="taskId"></param> 
    /// <returns></returns> 
    public AsanaTasksTemplate GetAsanaTasksForTask(string taskId) 
    { 
     // Get all tasks in the current task 
     var request = new RestRequest(string.Format("tasks/{0}/subtasks", taskId), Method.GET); 
     request.RequestFormat = DataFormat.Json; 

     var result = Execute<AsanaTasksTemplate>(request); 
     return result; 
    } 

답변

1

짧은 대답은 다음과 같습니다

여기에 내가이를 만드는 데 쓴 코드입니다! 다시 얻은 데이터를 제어 할 수있는 방법이 있으며 opt_fields이라고합니다. 따라서, 예를 들어 : - 프로젝트 에서 모든 작업 -

GET /projects/ID/tasks?opt_fields=name,notes,created_at,assignee.name,subtasks.name,subtasks.subtasks.name,subtasks.subtasks.subtasks.name

이것은 을 반환 양수인과 이름 - - 이름, 메모, 생성 시간 각 중첩 된 하위 작업을 3 단계까지

opt_expand=. 또는 opt_expand=.은 일반적으로 작업을 요청한 경우 일반적으로 반환 할 작업의 모든 "표준"필드를 제공합니다.

opt_expandopt_fields은 개발자 문서의 Input/Output options 섹션에 문서화되어 있습니다.

+0

감사합니다. 이는 통화를 100으로 줄였습니다 (위의 경우). 위에서 언급 한 프로젝트의 복제본을 작성하는 데는 약 200 건의 호출이 필요합니다. – Patrick

+0

필요한 모든 정보를 얻기 위해 하나의 쿼리를 만들 수 있다고 가정하면 총 101 개의 쿼리가 필요합니다. 모든 정보를 가져 오려면 1 GET, 각 작업을 생성하려면 100 개의 개별 POST 요청 (목표를 이해한다면 바르게). 그러나 실제적으로 GET은 많은 양의 데이터를 얻게 될 것이므로, [pagination] (http://developer.asana.com/documentation-preview/#Pagination)을 사용하여 청크만을 얻고 싶을 수도 있습니다. 25, 한 번에 - 200 개의 요청을 4로 축소합니다. – agnoster

+0

필요한 필드를 파악한 다음 최상위 레벨과 하위 타스크 레벨의 '? opt_fields'를 통해 요청할 필요가 있습니다. (당신은 하위 수준의 한 수준 만 가지고 있다고 언급했기 때문에). 예를 들어 이름과 메모 만 원할 경우'? opt_fields = name, notes, subtasks.name, subtasks.notes'를 사용합니다. 이렇게하면 모든 중첩 요청을 수행 할 필요가 없습니다. 태스크가 두 단계 깊숙이 중첩 될 수있는 드문 경우가 있는데, 'subtasks.subtasks.id'를 포함시킨 다음, 수동으로 찾을 수 있다면 수동으로 가져올 수 있습니다. – agnoster

관련 문제