Skip to content

API Documentation

Chihjen Ko edited this page Nov 27, 2018 · 30 revisions

已停止更新。請到各相關章節編輯。

API DEV BASE URL

https://api-dev.camera-trap.tw/v0.8

讓後端取得權限

前端登入 AWS 後隨即應將 idToken 送給後端,讓後端也有相應權限

  • endpoint /ctp-user/sign-in
  • post data {"idToken": $idToken}
  • response {"ret": $user_id}

@TODO:定期用 refreshToken 更新登入狀態

取得已登入者的使用者資訊

  • endpoint GET /ctp-user/me
  • response
{
  "ret": {
    "user_id": "OrcID_0000-0002-7446-3249",
    "name": "Thomas Yu",
    "email": "diabloevagto@gmail.com",
    "created": 1541310244.411,
    "modified": 1542562247.975
  }
}

計畫總覽 WF 2.2

列出與已登入使用者相關的計畫

  • endpoint /project/related-to-me
  • post data Optional, null or {"sort_key": "projectTitle"}
  • response {"ret": [$project_metadata, ...]}

計畫首頁 (sort of) WF 2.4

列出單一計畫的所有訊息 (含樣區、子樣區與相機位置)

  • endpoint GET project/${projectTitle}

系統公告 WF 2.2.1

塞資料(介面上好像不用管)

  • endpoint /announcement/bulk-insert
  • post data
{
  "message": 公告內容,
  "announcement_type": 公告類型,目前只有 SYSTEM,
  "level": 公告等級,暫時先分 INFO, WARNING,
  "target_id": optional, 先不管這個
}
  • response

讀資料

  • endpoint /announcement/query
  • post data 讀取最近 3 筆 (可自行改 limit)
{
  "query":{},
  "limit": 3,
  "sort": {"modified": -1}
}
  • response
{ ret: [$announcement]}

計畫總覽 WF 2.2.1

  • endpoint /project/summary-of-all
  • response
{
  "ret": [
    {
      "members": [
        "OrcID_0000-0002-7446-3249"
      ],
      "funder": "",
      "coverImage": null,
      "earliestRecordTimestamp": null,
      "projectTitle": "asasasas"
    },
    {
      "members": [
        "OrcID_0007-0183-5566-2266"
      ],
      "funder": "林務局",
      "coverImage": "http://example.org/kinda_animal_cover.jpg",
      "earliestRecordTimestamp": null,
      "projectTitle": "狂犬病監測"
    },
    {
      "members": [
        "OrcID_0000-0002-7446-3249"
      ],
      "funder": "測試-承辦單位",
      "coverImage": null,
      "earliestRecordTimestamp": null,
      "projectTitle": "測試-計畫名稱計畫名稱計畫名稱計畫名稱"
    },
    {
      "members": [
        "OrcID_0000-0002-7446-3249",
        "OrcID_0000-0003-1335-0184"
      ],
      "funder": "林務局",
      "coverImage": null,
      "earliestRecordTimestamp": null,
      "projectTitle": "測試計畫1"
    }
  ]
}

新增計畫 WF 2.3

新增前

由於權限控制機制會依使用者在特定計畫的角色決定使用者可進行的操作,使用者在新增計畫前必須要被設定為新計畫的 Project Manager。前提是計畫名稱不存在,也沒有其他使用者擁有與此計畫相關的任何角色。

  • endpoint /project/init
  • post data {"projectTitle": "新計畫的名稱"}
  • response default db response

新增計畫資料 WF 2.3.1 ~ 2.3.14

bulk-insertbulk-replace: bulk-* 系列的操作,post data 的 json root 都是 array,必要時可批次操作;

  • endpoint /project/bulk-insert
  • post data
[
  {
    "projectTitle": "測試計畫1 // 計畫名稱",
    "shortTitle": "測1 // 計畫簡稱",
    "funder": "林務局 // 委辦單位",
    "projectId": "FB-test-cameratrap-01 // 計畫編號",
    "principalInvestigator": "測試principalInvestigator // 計畫主持人",
    "projectStartDate": "2018-10-15 // 計畫時間:起",
    "projectEndDate": "2018-12-10 // 計畫時間:迄",
    "adminArea": [ // 計畫地區, 見 WF 2.3.7
      "苗栗縣",
      "新竹縣"
    ],
    "abstract": "// 計畫摘要",
    "remarks": "// 備註",
    "coverImage": "http://example.org/kinda_animal_cover.jpg //計畫封面",
    "license": { 創用 CC 授權 // WF 2.3.11 ~ WF 2.3.13
      "metadata": "CC BY 4.0", // 詮釋資料授權
      "data": "CC BY 4.0", // 鑑定資訊授權
      "multimedia": "CC BY-NC 4.0" // 影像資料授權
    },
    "dataFieldEnabled": [ // 欄位設定 WF 3.2.1
      "sex", // 性別
      "lifeStage", // 年齡
      "antler", // 角況
      "remarks" // 備註
    ],
    "cameraLocations": [
      {
        "fullCameraLocationMd5": "md5 string of `$projectTitle/$site/$subSite/$cameraLocation`, use `NULL` for null value",
        "projectTitle": "測試計畫1",
        "site": "苗栗",
        "subSite": "南庄鄉田美村",
        "cameraLocation": "HC20A",
        "original_x": "122",
        "original_y": "23.5",
        "original_geodatum": "wgs84",
        "elevation": 56,
        "wgs84dec_x": 122,
        "wgs84dec_y": 23.5,
        "twd97tm2_x": 223456,
        "twd97tm2_y": 2345678,
        "dailyTestTime": [ // 可先略過這項
          {
            "since": 1539593959,
            "time": "12:00:00"
          }
        ],
        "vegetation": "榕楠林帶",
        "land_cover": "森林"
      }
    ],
    "dailyTestTime": [
      {
        "since": 1539593959,
        "time": "12:00:00"
      }
    ],
    "timezone": "+8",
    "dataPublicDate": "// 資料公開日期,計畫起始時間的兩年後"
  }
]
  • response default db response

計畫地區 WF 2.3.7

let adminAreaOptions = [
  "台北市",
  "新北市",
  "桃園市",
  "台中市",
  "台南市",
  "高雄市",
  "基隆市",
  "新竹市",
  "嘉義市",
  "新竹縣",
  "苗栗縣",
  "彰化縣",
  "雲林縣",
  "嘉義縣",
  "屏東縣",
  "宜蘭縣",
  "花蓮縣",
  "台東縣",
  "澎湖縣",
  "金門縣",
  "連江縣"
];

創用CC授權選項 WF 2.3.7

let adminAreaOptions = [
  "CC0", // 無著作權 (CC0)
  "CC BY 4.0", // 姓名標示
  "CC BY-NC" // 姓名標示-非商業性
];

影像辨識狀況 (特定年度特定計畫) WF 2.6, WF 2.7, WF 2.8

fullCameraLocationMd5 與 site 值為 optional, 若不給定此值,則會針對所有 sites 與 camera locations 進行統計

  • endpoint /project/location-month-identified-num
  • post data
{
  "year": 2017,
  "projectTitle": "測試計畫1",
  "site": "新竹", // optional
  "fullCameraLocationMd5": "4d3d38693056909db46c564531a63e8c" // optional
}
  • response
{
  "ret": [
    {
      "_id": "4d3d38693056909db46c564531a63e8c",
      "projectTitle": "測試計畫1",
      "site": "新竹",
      "subSite": "南庄30林班",
      "cameraLocation": "HC21A",
      "monthly_num": [
        {
          "month": 3,
          "num": 6
        },
        {
          "month": 2,
          "num": 115
        },
        {
          "month": 1,
          "num": 21
        }
      ],
      "fullCameraLocationMd5": "4d3d38693056909db46c564531a63e8c",
      "wgs84dec_x": 122.563,
      "wgs84dec_y": 23.7
    }
  ]
}

影像回收狀況 (特定年度特定計畫) WF 2.6, WF 2.7, WF 2.8

fullCameraLocationMd5 與 site 值為 optional, 若不給定此值,則會針對所有 sites 與 camera locations 進行統計

  • endpoint /project/location-month-retrieved-num
  • post data
{
  "year": 2017,
  "projectTitle": "測試計畫1",
  "site": "新竹", // optional
  "fullCameraLocationMd5": "4d3d38693056909db46c564531a63e8c" // optional
}
  • response
{
  "ret": [
    {
      "_id": "4d3d38693056909db46c564531a63e8c",
      "projectTitle": "測試計畫1",
      "site": "新竹",
      "subSite": "南庄30林班",
      "cameraLocation": "HC21A",
      "monthly_num": [
        {
          "month": 3,
          "num": 6
        },
        {
          "month": 2,
          "num": 115
        },
        {
          "month": 1,
          "num": 21
        }
      ],
      "fullCameraLocationMd5": "4d3d38693056909db46c564531a63e8c",
      "wgs84dec_x": 122.563,
      "wgs84dec_y": 23.7
    }
  ]
}

相機異常回報 WF 2.10.1

  • endpoint /abnormal-data/bulk-replace
  • post data
[{
  "projectTitle": "測試計畫1", // 計畫名稱
  "site": "新竹", // 樣區
  "subSite": "南庄30林班", // 子樣區
  "cameraLocation": "HC20A", // 相機位置
  "fullCameraLocationMd5": md5("$projectTitle/$site/$subSite/cameraLocation"), // 前端產生, $subSite 若為空值,帶入字串的 'NULL', 
  "abnormalStartDate": "2017/02/08", // 異常資料時間 起
  "abnormalEndDate": "2017/03/01", // 異常資料時間 迄
  "abnormalType": 選自 `相機故障 (空拍過多)`, `相機故障 (沒有影像)`, `相機失竊`, `相機電量耗損過快`, `其他`,
  "remarks": "備註"
}]
  
  • response

相機異常值

  • endpoint /project/location-month-abnormal
  • post data
{
  "projectTitle": "測試計畫1",
  "year": 2017,
  "site": "新竹", // 20181108 已改為 optional
  "fullCameraLocationMd5": optional
}
  • response
{
  "ret": [
    {
      "projectTitle": "測試計畫1",
      "site": "新竹",
      "subSite": "南庄30林班",
      "cameraLocation": "HC21A",
      "fullCameraLocationMd5": "4d3d38693056909db46c564531a63e8c",
      "wgs84dec_x": 121.5,
      "wgs84dec_y": 23.56,
      "year": 2017,
      "month": [
        3,
        2
      ],
      "abnormalType": "其他",
      "abnormalStartDate": "2017/02/08",
      "abnormalEndDate": "2017/03/01",
      "remarks": "資料沒錯,只是測試用"
    }
  ]
}

計畫已辨識物種 WF 2.11.2

  • endpoint /project/image-species-group

  • post data

{
  "projectTitle": "$projectTitle" // 計畫名稱,例如:測試計畫1
}
  • response
{
  "ret": [
    {
      "species_group": [
        {
          "species": "松鼠",
          "count": 3
        },
        {
          "species": "獼猴",
          "count": 63
        },
        {
          "species": "食蟹獴",
          "count": 3
        },
        {
          "species": "無法辨識",
          "count": 3
        },
        ...,
        {
          "species": "鼬獾",
          "count": 150
        }
      ],
      "total": 1895,
      "modified": 1542014476.298
    }
  ]
}

計畫管理 WF 3

申請新增欄位 WF 3.2.1.c, (WF 3.2.3, WF 3.2.4)

這塊先跳過

update 特定欄位的寫法 WF 3, WF 4 全體適用

如果確定文件存在,只想修改其中特定欄位,例如:增加欄位、地點,則改用 bulk-update,並需要特定的 spec for access control _id: 必要篩選條件,篩選出欲更新的目標文件; projectTitle:權限管控並保護資料一致性,不會真的用在資料更新上 $set: 設定文件屬性值。

  • endpoint /project/bulk-update
  • post data
[{
  "_id": "測試計畫1",
  "projectTitle": "測試計畫1",
  "$set": {
    "dataFieldEnabled": [ // 欄位設定 WF 3.2.1.b, WF 3.2.1.d, WF 3.2.1.e
      "sex", // 性別
      "lifeStage", // 年齡
      "antler", // 角況
      "remarks" // 備註
    ],
    "speciesList": [ // 常見物種順序 WF 3.3.2, default 值如下
      "空拍",
      "定時測試",
      "工作照",
      "山羌",
      "水鹿",
      "獼猴",
      "鼬獾",
      "山羊",
      "野豬",
      "鼠類",
      "白鼻心",
      "人",
      "藍腹鷴",
      "食蟹獴",
      "狗"
    ],
    "cameraLocations": [ // 相機位置管理 WF 3.4, WF 3.5
      {
        "fullCameraLocationMd5": "這是算出來的 camera location id, md5 string of `$project/$site/$sub_site/$location`, use string `NULL` for null value",
        "projectTitle": "測試計畫1 // 計畫名稱",
        "site": "苗栗 // 樣區",
        "subSite": "南庄鄉田美村 // 子樣區",
        "cameraLocation": "HC20A // 相機位置",
        "original_x": "122", // 使用者輸入的原始 x 值
        "original_y": "23.5", // 使用者輸入的原始 y 值
        "original_geodatum": "WGS84" // 使用者選定的大地基準 WF 3.4.4,
        "elevation": 56, // 海拔(公尺)
        "wgs84dec_x": 122, // (轉換後的) WGS84 十進位經度座標
        "wgs84dec_y": 23.5, // (轉換後的) WGS84 十進位緯度座標
        "twd97tm2_x": 223456, // (轉換後的) TWD97TM2 X值
        "twd97tm2_y": 2345678, // (轉換後的) TWD97TM2 Y值
        "dailyTestTime": [ // 可先略過這個
          {
            "since": 1539593959,
            "time": "12:00:00"
          }
        ],
        "vegetation": "榕楠林帶", // 植被
        "land_cover": "森林" // 土地覆蓋類型
      },
      { // 另一個相機地點
        "fullCameraLocationMd5": "another location ...",
        ...
      },
      ...
    ]
  }
}]

欄位設定 WF 3.2.1 的可用欄位

  • endpoint GET /data-field-available

編輯特定 array item 的寫法

或已知當下在編輯 cameraLocations 下的特定 array item, 例如設定第 2 個 item

替換整個 item
[{
  "_id": "測試計畫1",
  "projectTitle": "測試計畫1",
  "$set": {
    "cameraLocations.2": {
      "fullCameraLocationMd5": "md5 string of `$project/$site/$sub_site/$location`, use `NULL` for null value",
      "projectTitle": "測試計畫1",
      "site": "苗栗",
      "subSite": "南庄鄉田美村",
      "cameraLocation": "HC20A",
      "original_x": "122",
      "original_y": "23.5",
      "original_geodatum": "wgs84",
      "elevation": 56,
      "wgs84dec_x": 122,
      "wgs84dec_y": 23.5,
      "twd97tm2_x": 223456,
      "twd97tm2_y": 2345678,
      "dailyTestTime": [
        {
          "since": 1539593959,
          "time": "12:00:00"
        }
      ],
      "vegetation": "榕楠林帶",
      "land_cover": "森林"
    }
  }
}]
編輯特定 item 的特定欄位值:
[{
  "_id": "測試計畫1",
  "projectTitle": "測試計畫1",
  "$set": {
    "cameraLocations.2.wgs84dec_x": 122.56, // 原本是 122
    "cameraLocations.2.elevation": 78 // 原本是 56
  }
}]
  • response default db response

檔案上傳 WF 5.3

必要資訊:

  • fullCameraLocationMd5 檔案上傳時,會需要替每個待上傳的檔案設定 site、subSite、cameraLocation等資訊,加上 projectTitle,即可產生 fullCameraLocationMd5 md5(projectTitle/site/subSite/cameraLocation),計畫設定上若不需要填寫 subSite,補上字串的 'NULL'
  • upload session id 替每個檔案產生一個 uuid v4 的 upload session id ($sessid)

產生 upload session id,安排上傳路徑

於前端產生 upload session id (uuid v4) 值,以下簡稱 sessid,並依檔案類型上傳至以下位置 (暫時稱為 $PATH_PREFIX): ZIP:upload/$sessid/zip/ CSV:upload/$sessid/csv/ JPG:upload/$sessid/image/ MP4/AVI:upload/$sessid/video/

更新上傳事件狀態資訊

只在以下幾個情境需要更新上傳事件狀態:

  1. 開始上傳時將狀態設為 WAITING
  2. 成功時更新為 SUCCESS
  3. 失敗 FAILED
  4. 取消 CANCELLED
  • endpoint /upload-session/bulk-update
  • post data
[
  {
    _id: $sessid,
    projectTitle: projectTitle,
    $set: {
      status: SUCCESS|FAILED|WAITING|CANCELLED
    },
    $setOnInsert: {
      fullCameraLocationMd5: $fullCameraLocationMd5,
      projectTitle: $projectTitle,
      site: $site,
      subSite: $subSite,
      cameraLocation: $cameraLocation
      by: $user_id,
      file: $PATH_PREFIX + file.name
    },
    $upsert: true
  }
]
  • response default db response

設定上傳參數與 tags

於前端上傳檔案至 AWS S3 時,加入 projectTitle, site, subSite, cameraLocation, user_id 等 tags;如果 subSite 是空值,請填入字串的 'NULL'

let bucket = 'camera-trap';
let key = $PATH_PREFIX + file.name;
// 替每個上傳檔設定 uploader
let uploader = new AWS.S3.ManagedUpload({
  params: {Bucket: bucket, Key: key, Body: file},
  tags: [
    {Key: "projectTitle", Value: $project},
    {Key: "site", Value: $site},
    {Key: "subSite", Value: $subSite},
    {Key: "cameraLocation", Value: $cameraLocation},
    {Key: "user_id", Value: $user_id}
  ]
});

進行上傳 WF 5.6


let seErrHandler = function (err, data) {
  ...
}

uploader.send(s3ErrHandler);

顯示上傳進度 WF 5.6, WF 5.7

uploader.on('httpUploadProgress', function(progress) {
  console.log((100 * progress.loaded / progress.total) + '%');
  // console.log(progress);
});

檢視與特定上傳事件相關的資料 WF 5.6, WF 5.7

query:查詢條件 projection:回傳欄位 (default 是回傳完整文件)

  • endpoint /media/annotation/query
  • post data
{
  "query": {
    "related_upload_sessions": $sessid
  }
}
  • response {"ret": [ $multimedia_annotation, ... ]}

上傳紀錄 WF 6.1

顯示與登入使用者相關的上傳操作紀錄

  • endpoint GET /upload-session/mine
  • response
{
  "ret": [
    {
      "_id": "test_upload_session_02",
      "upload_session_id": "test_upload_session_02",
      "projectTitle": "測試計畫1",
      "fullCameraLocationMd5": "263d239eb09fa3b607f4846e67b91ba3",
      "status": "ERROR",
      "by": "OrcID_0000-0002-7446-3249",
      "modified": 1542009001.994,
      "messages": [ // 詳細錯誤訊息
        {
          "key": "upload/test_upload_session_02/csv/TD06B.csv",
          "errors": [
            "上傳資料與過往資料重疊,暫不匯入."
          ],
          "modified": 1541750623.705,
          "problematic_ids": [潛在有問題的資料ID, ...],
        },
        {
          "key": "upload/test_upload_session_02/csv/TD03A.csv",
          "errors": [
            "上傳資料與過往資料重疊,暫不匯入."
          ],
          "modified": 1541750915.423,
          "problematic_ids": [潛在有問題的資料ID, ...],
        },
        ...
      ],
      "file": "上傳的那個檔案",
      "created": 1540788756.494,
      "modified": 1542014471.609,
    }
  ]
}

計畫成員 WF 3.6

加入計畫成員 WF 3.6.1.1

OrcID 不提供 email 資訊,沒辦法用 email 加人,先做使用 OrcID 加人

  • endpoint /project/add-user-to-project
  • post data
{
  "user_id": $user_id, // OrcID_XXXX-XXXX-XXXX-XXXX
  "projectTitle": $projectTitle, // 欲加入的計畫名稱
  "role": $role // 角色,待建立對應表
}
  • response default db response
角色對應表
// 計畫相關角色 (允許在 3.6.1.1 加入)
ProjectManager 計畫管理員
Researcher 研究人員
ResearchAssistant 研究助理
CaseOfficer 林管處承辦人

// 機能型角色 (不允許在 3.6.1.1 加入)
SysAdmin 系統管理員
ProjectInitiator 可建立新計畫的人

列出計畫下的所有成員資訊(總筆數即成員數) WF 3.6.1.2

  • endpoint /ctp-user/query
  • post data
{
  "query": {
    "project_roles.projectTitle": $projectTitle,
    "project_roles.roles": {"$in": ["ProjectManager", "Researcher", "ResearchAssistant", "CaseOfficer"]}
  }
}
  • response {"ret": [ $ctp-user ]}

刪除計畫成員 WF 3.6.1.2.d

暫時略過刪除,API 開發中

版本紀錄 WF 4.1.3.4, WF 4.16

目前設計是針對檔案,由於每個檔案可能有 1N 個 tokens,故每個 revisions 也可能有 1N 個 tokens。

  • endpoint /annotation-revision/query
  • post data
{
  "query": {
    "_id": "11053ee0ec864feca68e7bf8932dd23e" // url_md5 = _id from WF 4.2 /media/annotation/query
  },
  "sort": {
    "revisions.created": 1
  }
}
  • response
{
  "results": [
    {
      "_id": "11053ee0ec864feca68e7bf8932dd23e",
      "revisions": [
        {
          "modifiedBy": "OrcID_0000-0002-7446-3249",
          "created": 1542014474.531,
          "tokens": [
            { // 可直接用於 restore 的資料單元
              "data": [ 
                {
                  "key": "species",
                  "label": "物種",
                  "value": "山羌",
                  "data_error_flag": false,
                  "last_validated_timestamp": 1542014471.053,
                  "unit": "",
                  "context": "camera-trap"
                },
                {
                  "key": "sex",
                  "label": "性別",
                  "value": "NA",
                  "data_error_flag": true,
                  "last_validated_timestamp": 1542014471.053,
                  "unit": "",
                  "context": "camera-trap"
                },
                {
                  "key": "lifeStage",
                  "label": "年齡",
                  "value": "NA",
                  "data_error_flag": true,
                  "last_validated_timestamp": 1542014471.053,
                  "unit": "",
                  "context": "camera-trap"
                },
                {
                  "key": "id",
                  "label": "id",
                  "value": "NA",
                  "data_error_flag": false,
                  "last_validated_timestamp": 1542014471.053,
                  "unit": "",
                  "context": "camera-trap"
                },
                {
                  "key": "category",
                  "label": "category",
                  "value": "NA",
                  "data_error_flag": false,
                  "last_validated_timestamp": 1542014471.053,
                  "unit": "",
                  "context": "camera-trap"
                },
                {
                  "key": "sciName",
                  "label": "sciName",
                  "value": "Muntiacus reevesi micrurus",
                  "data_error_flag": false,
                  "last_validated_timestamp": 1542014471.053,
                  "unit": "",
                  "context": "camera-trap"
                },
                {
                  "key": "behavior",
                  "label": "behavior",
                  "value": "NA",
                  "data_error_flag": false,
                  "last_validated_timestamp": 1542014471.053,
                  "unit": "",
                  "context": "camera-trap"
                }
              ],
              "summary": { // 用於介面顯示的 revision 摘要
                "species": "山羌",
                "sex": "NA",
                "lifeStage": "NA",
                "id": "NA",
                "category": "NA",
                "sciName": "Muntiacus reevesi micrurus",
                "behavior": "NA"
              }
            },
            { // 同張照片的第 2 筆 record
              "data": [ 
                {
                  "key": "species",
                  "label": "物種",
                  "value": "山羌",
                  "data_error_flag": false,
                  "last_validated_timestamp": 1542014471.053,
                  "unit": "",
                  "context": "camera-trap"
                },
                {
                  "key": "sex",
                  "label": "性別",
                  "value": "NA",
                  "data_error_flag": true,
                  "last_validated_timestamp": 1542014471.053,
                  "unit": "",
                  "context": "camera-trap"
                },
                {
                  "key": "lifeStage",
                  "label": "年齡",
                  "value": "non-adult",
                  "data_error_flag": true,
                  "last_validated_timestamp": 1542014471.053,
                  "unit": "",
                  "context": "camera-trap"
                },
                {
                  "key": "id",
                  "label": "id",
                  "value": "NA",
                  "data_error_flag": false,
                  "last_validated_timestamp": 1542014471.053,
                  "unit": "",
                  "context": "camera-trap"
                },
                {
                  "key": "category",
                  "label": "category",
                  "value": "NA",
                  "data_error_flag": false,
                  "last_validated_timestamp": 1542014471.053,
                  "unit": "",
                  "context": "camera-trap"
                },
                {
                  "key": "sciName",
                  "label": "sciName",
                  "value": "Muntiacus reevesi micrurus",
                  "data_error_flag": false,
                  "last_validated_timestamp": 1542014471.053,
                  "unit": "",
                  "context": "camera-trap"
                },
                {
                  "key": "behavior",
                  "label": "behavior",
                  "value": "NA",
                  "data_error_flag": false,
                  "last_validated_timestamp": 1542014471.053,
                  "unit": "",
                  "context": "camera-trap"
                }
              ],
              "summary": { // 同照片第二筆資料用於介面顯示的摘要
                "species": "山羌",
                "sex": "NA",
                "lifeStage": "non-adult",
                "id": "NA",
                "category": "NA",
                "sciName": "Muntiacus reevesi micrurus",
                "behavior": "NA"
              }
            }
          ]
        }
      ],
      "url_md5": "11053ee0ec864feca68e7bf8932dd23e"
    }
  ]
}

版本紀錄 還原成此版本 WF 4.16.2

  • endpoint /annotation-revision/restore
  • post data
{
  "url_md5": "11053ee0ec864feca68e7bf8932dd23e",
  "revision_tokens": [ // 選定要還原的 revision 下的 tokens 直接搬過來,其餘後端處理
    {
      "data": [ 
        {
          "key": "species",
          "label": "物種",
          "value": "山羌",
          "data_error_flag": false,
          "last_validated_timestamp": 1542014471.053,
          "unit": "",
          "context": "camera-trap"
        },
        {
          "key": "sex",
          "label": "性別",
          "value": "NA",
          "data_error_flag": true,
          "last_validated_timestamp": 1542014471.053,
          "unit": "",
          "context": "camera-trap"
        },
        {
          "key": "lifeStage",
          "label": "年齡",
          "value": "NA",
          "data_error_flag": true,
          "last_validated_timestamp": 1542014471.053,
          "unit": "",
          "context": "camera-trap"
        },
        {
          "key": "id",
          "label": "id",
          "value": "NA",
          "data_error_flag": false,
          "last_validated_timestamp": 1542014471.053,
          "unit": "",
          "context": "camera-trap"
        },
        {
          "key": "category",
          "label": "category",
          "value": "NA",
          "data_error_flag": false,
          "last_validated_timestamp": 1542014471.053,
          "unit": "",
          "context": "camera-trap"
        },
        {
          "key": "sciName",
          "label": "sciName",
          "value": "Muntiacus reevesi micrurus",
          "data_error_flag": false,
          "last_validated_timestamp": 1542014471.053,
          "unit": "",
          "context": "camera-trap"
        },
        {
          "key": "behavior",
          "label": "behavior",
          "value": "NA",
          "data_error_flag": false,
          "last_validated_timestamp": 1542014471.053,
          "unit": "",
          "context": "camera-trap"
        }
      ],
      "summary": {
        "species": "山羌",
        "sex": "NA",
        "lifeStage": "NA",
        "id": "NA",
        "category": "NA",
        "sciName": "Muntiacus reevesi micrurus",
        "behavior": "NA"
      }
    },
    {
      "data": [ 
        {
          "key": "species",
          "label": "物種",
          "value": "山羌",
          "data_error_flag": false,
          "last_validated_timestamp": 1542014471.053,
          "unit": "",
          "context": "camera-trap"
        },
        {
          "key": "sex",
          "label": "性別",
          "value": "NA",
          "data_error_flag": true,
          "last_validated_timestamp": 1542014471.053,
          "unit": "",
          "context": "camera-trap"
        },
        {
          "key": "lifeStage",
          "label": "年齡",
          "value": "non-adult",
          "data_error_flag": true,
          "last_validated_timestamp": 1542014471.053,
          "unit": "",
          "context": "camera-trap"
        },
        {
          "key": "id",
          "label": "id",
          "value": "NA",
          "data_error_flag": false,
          "last_validated_timestamp": 1542014471.053,
          "unit": "",
          "context": "camera-trap"
        },
        {
          "key": "category",
          "label": "category",
          "value": "NA",
          "data_error_flag": false,
          "last_validated_timestamp": 1542014471.053,
          "unit": "",
          "context": "camera-trap"
        },
        {
          "key": "sciName",
          "label": "sciName",
          "value": "Muntiacus reevesi micrurus",
          "data_error_flag": false,
          "last_validated_timestamp": 1542014471.053,
          "unit": "",
          "context": "camera-trap"
        },
        {
          "key": "behavior",
          "label": "behavior",
          "value": "NA",
          "data_error_flag": false,
          "last_validated_timestamp": 1542014471.053,
          "unit": "",
          "context": "camera-trap"
        }
      ],
      "summary": {
        "species": "山羌",
        "sex": "NA",
        "lifeStage": "non-adult",
        "id": "NA",
        "category": "NA",
        "sciName": "Muntiacus reevesi micrurus",
        "behavior": "NA"
      }
    }
  ]
}
  • response default mongodb response

資料篩選 WF 4.2

fullCameraLocationMd5 optional, 拿掉此值會得到所有相機位置資料 date_time_corrected_timestamp optional

  • endpoint /media/annotation/query
  • post data
{
  "query": {
    "projectTitle": "測試計畫1",
    "site": "苗栗",
    "fullCameraLocationMd5": {
      "$in": [fullCameraLocationMd5_1, ...]
    },
    "date_time_corrected_timestamp": {
      "$gte": 4.2.1.c 選取的起始時間timestamp, optional
      "$lte": 4.2.1.c 選取的結束時間timestamp, optional
    }
  },
  "projection": {
    "projectTitle": true,
    "site": true,
    "subSite": true,
    "cameraLocation": true,
    "fullCameraLocationMd5": true,
    "tokens.data.key": true,
    "tokens.data.label": true,
    "tokens.data.value": true,
    "corrected_date_time": true,
    "date_time_corrected_timestamp": true,
    "url": true,
    "low_quality_url": true,
    "imageUrlPrefix": true
  },
  "limit": 1000, // 視前端效能調整數字, WF 4.6.1.a
  "skip": 0 (for page 1, 1000 for page 2, ... etc.)
}
  • response

limit 與 skip 限制的是回傳的 results 數,單位是多媒體標註文件 media annotation(以下簡稱annotation)。 annotation 下會有 tokens,每個 token 是表格資料裡的一個 row。 tokens.data 的每個物件即額外欄位

表格資料欄位與對應的回傳資料:

date_time_corrected_timestamp 便於計算連續照片是否為連拍用

不允許內容更動的欄位 -- 樣區:$site + ["-" + subSite] -- 相機位置:$cameraLocation -- 檔名:base name of $url -- 時間:$corrected_date_time 允許內容更動的欄位 -- tokens.data

Required: -- 物種: data.key == species 其他要顯示的部分(含要顯示的欄位與順序),請參考計畫啟用的自訂欄位 project.dataFieldEnabled -- 性別: data.key == sex -- 年齡: data.key == lifeStage -- 角況: data.key == antler -- 備註: data.key == remarks 除了以上必要欄位與啟用的自訂欄位,剩下的都「不要顯示」在編輯表單

{
  "results": [
    ...,
    {
      "_id": "11053ee0ec864feca68e7bf8932dd23e",
      "tokens": [
        {
          "data": [
            {
              "key": "species",
              "value": "山羌",
              "label": "物種"
            },
            {
              "key": "sex",
              "value": "NA",
              "label": "性別"
            },
            {
              "key": "lifeStage",
              "value": "NA",
              "label": "年齡"
            },
            {
              "key": "id",
              "value": "NA",
              "label": "id"
            },
            {
              "key": "category",
              "value": "NA",
              "label": "category"
            },
            {
              "key": "sciName",
              "value": "Muntiacus reevesi micrurus",
              "label": "sciName"
            },
            {
              "key": "behavior",
              "value": "NA",
              "label": "behavior"
            }
          ]
        },
        {
          "data": [
            {
              "key": "species",
              "value": "山羌",
              "label": "物種"
            },
            {
              "key": "sex",
              "value": "NA",
              "label": "性別"
            },
            {
              "key": "lifeStage",
              "value": "non-adult",
              "label": "年齡"
            },
            {
              "key": "id",
              "value": "NA",
              "label": "id"
            },
            {
              "key": "category",
              "value": "NA",
              "label": "category"
            },
            {
              "key": "sciName",
              "value": "Muntiacus reevesi micrurus",
              "label": "sciName"
            },
            {
              "key": "behavior",
              "value": "NA",
              "label": "behavior"
            }
          ]
        }
      ],
      "url": "images/orig/測試計畫1/苗栗/南庄鄉田美村/HC20A/IMG_0064_1486661309.jpg",
      "url_md5": "11053ee0ec864feca68e7bf8932dd23e",
      "projectTitle": "測試計畫1",
      "site": "苗栗",
      "subSite": "南庄鄉田美村",
      "cameraLocation": "HC20A",
      "fullCameraLocationMd5": "e6d9c06937a24d9db8ac9a431b89aa17",
      "corrected_date_time": "2017-02-09 17:28:29",
      "low_quality_url": "some low quality image url",
      "imageUrlPrefix": "https://....."
    }
    ...
  ]
}
    

相機位置資料是否上鎖 WF 4.2.1.b

查詢相機位置資料已上鎖/上鎖者是誰

  • endpoint /camera-location/data-lock/locked
  • post data
{
  "projectTitle": "測試計畫1", // required 計畫名稱
  "site": "苗栗", // optional 樣區名稱
  "subSite": "南庄30林班", // optional 子樣區名稱
  "fullCameraLocationMd5": null, // optional 相機位置 ID
}
  • response
{
  "ret": [
    {
      "cameraLocationDataLock": {
        "fullCameraLocationMd5": "e6d9c06937a24d9db8ac9a431b89aa17",
        "projectTitle": "測試計畫1",
        "locked": true,
        "locked_by": {
          "user_id": "OrcID_0000-0002-7446-3249",
          "name": "Thomas Yu",
          "email": "XXXX@XXXX.XXX"
        },
        "locked_on": 0,
        "site": "苗栗",
        "subSite": "南庄鄉田美村",
        "cameraLocation": "HC20A"
      }
    },
    {
      "cameraLocationDataLock": {
        "fullCameraLocationMd5": "8c0223d81f4958ddc3a776e0c7337e4c",
        "projectTitle": "測試計畫1",
        "locked": true,
        "locked_by": {
          "user_id": "OrcID_0000-0002-7446-3249",
          "name": "Thomas Yu",
          "email": "XXXX@XXXX.XXX"
        },
        "locked_on": 0,
        "site": "苗栗",
        "subSite": "南庄鄉田美村",
        "cameraLocation": "HC20B"
      }
    },
    {
      "cameraLocationDataLock": {
        "fullCameraLocationMd5": "4d3d38693056909db46c564531a63e8c",
        "projectTitle": "測試計畫1",
        "locked": true,
        "locked_by": {
          "user_id": "OrcID_0000-0002-7446-3249",
          "name": "Thomas Yu",
          "email": "XXXX@XXXX.XXX"
        },
        "locked_on": 0,
        "site": "新竹",
        "subSite": "南庄30林班",
        "cameraLocation": "HC21A"
      }
    }
  ]
}

編輯模式, 鎖相機位置 WF 4.3.2

fullCameraLocationMd5:相機地點 id projectTitle:計畫名稱,除了當雙保險,還用來限制本操作的權限

後端機制會在 bulk-replace 批次更新相機位置上鎖狀態前,檢查相機位置是否已被其他人鎖定。欲鎖定的多個相機位置中,只要有一個已被他人鎖定,整個鎖定流程都會失敗

  • endpoint /camera-location/data-lock/bulk-replace
  • post data
[
  {
    "fullCameraLocationMd5": "4d3d38693056909db46c564531a63e8c", // 相機位置 id
    "projectTitle": "測試計畫1", // 計畫名稱
    "locked": false, // 上鎖 true / 解鎖 false
  },
  {
    // 更多相機位置
  },
  ...
]
  • response default db response

編輯模式, 儲存按鈕 WF 4.3.2.c

更新 WF 4.2 response 的資料 annotation > tokens[] > data[] 使用者上傳的資料有可能包含不在 WF 3.2 允許的欄位,需要將之保留,因此要用特定的 update 寫法。

  • endpoint /media/annotation/bulk-update
  • post data 根據 WF 4.2 回傳的資料(要注意 array items 的順序)修改現有的 tokens.data
[
  {
    "_id": "11053ee0ec864feca68e7bf8932dd23e", // annotation 中的 _id 或 url_md5 (兩個值相同)
    "projectTitle": "測試計畫1", // annotation 中的 projectTitle
    "fullCameraLocationMd5": "e6d9c06937a24d9db8ac9a431b89aa17", // annotation 中的 fullCameraLocationMd5
    "$set": {
      "tokens.0.data.2.value": "Adult", // 設定annotation下的第1個token的第3項資料值
      "tokens.1.data.1.value": "F" // 設定annotation下的第2個token的第2項資料
    }
  },
  {
    // 更新另一個 annotation 資料
  },
  ...
]

複製一列並貼上 by 增加一組 tokens, WF 4.10.2, WF 4.10.3

[
  {
    "_id": "11053ee0ec864feca68e7bf8932dd23e",
    "projectTitle": "測試計畫1",
    "fullCameraLocationMd5": "e6d9c06937a24d9db8ac9a431b89aa17",
    "$push": {
      "tokens": {
        "data": [
          {
            "key": "species",
            "label": "物種",
            "value": // 複製過來的值,
          },
          {
            // 其他複製過來的 data
          },
          ...
        ],
        "token_id": uuid(),
        "species_shortcut": "...", // data.key == species 的 data.value
        "bbox": {
          "full_scope": true,
          "original_point": "topleft"
        },
        "meta": {
          "virtual_individual_id": uuid(),
          "virtual_part_id": uuid()
        }
        "description_level": "individual",
        "token_error_flag": true // 複製過來的值,
        "video_paused_at": null
      }
    }
  },
  {
    // 針對更多的 annotations ...
  },
  ...
]
  • response default db response

編輯模式 操作相關

下拉物種清單(與其他有固定選項的欄位) WF 4.5, WF 4.9

取得特定計畫要顯示的所有欄位 WF 4.1.3

含必要欄位 (species)、已啟用的自訂欄位 (dataFieldEnabled) 與欄位允許內容資訊

  • endpoint /project/data-fields

  • post data

{
  "projectTitle": "測試計畫1"
}
  • response
{
  "ret": [
    {
      "_id": null,
      "speciesList": [ // 必填欄位,label:物種, key:species
        "山羌",
        "水鹿",
        "鼬獾",
        "定時測試",
        "工作照",
        "空拍"
      ],
      "dailyTestTime": [ // 每日拍攝測試照的時間, 24 時制
        {
          "since": 1539593959,
          "time": "12:00:00"
        }
      ],
      "fieldDetails": [ // 其他啟用欄位
        {
          "_id": "lifeStage",
          "key": "lifeStage",
          "label": "年齡",
          "description": "string",
          "widget_type": "select", // 如果是 select, 則會需要 options
          "widget_select_options": [
            "Young",
            "Adult",
            "Unknown"
          ],
          "created": 1541401451.944,
          "modified": 1541401451.944,
          "widget_date_format": null
        },
        {
          "_id": "sex",
          "key": "sex",
          "label": "性別",
          "description": "string",
          "widget_type": "select",
          "widget_select_options": [
            "M",
            "F",
            "Unknown"
          ],
          "created": 1541401451.944,
          "modified": 1541401451.944,
          "widget_date_format": null
        },
        {
          "_id": "antler",
          "key": "antler",
          "label": "角況",
          "description": "string",
          "widget_type": "select",
          "widget_select_options": [
            "TBD",
            "Unknown"
          ],
          "created": 1541401451.944,
          "modified": 1541401451.944,
          "widget_date_format": null
        },
        {
          "_id": "remarks",
          "key": "remarks",
          "label": "備註",
          "description": "其他相關內容",
          "widget_type": "text", // 文字欄位,不做任何內容檢查
          "created": 1541401451.944,
          "modified": 1541401451.944,
          "widget_select_options": null,
          "widget_date_format": null
        }
      ]
    }
  ]
}

整份文件更新 (可以先不管這邊)

bulk-update 方法需要特定的 spec for access control _id: update 的對象 projectTitle:權限管控並保護資料一致性,不會真的用在資料更新上 fullCameraLocationMd5:同 project $set:裡面若有設定 project 與 fullCameraLocationMd5,後端會為了維護一致性將之清除

  • endpoint /media/annotaion/bulk-update
  • post data
[{
  "_id": $url_md5,
  "projectTitle": $projectTitle,
  "fullCameraLocationMd5": $fullCameraLocationMd5,
  "$set": {
    "tokens": [
      {
        "data": [
          {
            "label": "物種",
            "key": "species",
            "value": "鼬獾",
            "unit": "",
            "data_error_flag": false|true,
            "last_validated_timestamp": now(),
            "context": "camera-trap"
          },
          {
            // 其他 data
          },
          ...
        ],
        "species_shortcut": "鼬獾",
        ... // 其他屬性維持不變
      },
      {
        // 其他 tokens
      },
      ...
    ]
  }
}]

多媒體資料查詢

  • endpoint /media/annotation/query
  • post data MongoDB 的 find patterns,可利用 limit 與 skip 分頁。
{
  "query": { 
    "$or": [
      {     
        "$and": [
          {         
            "tokens.data.key": "species"
          },        
          {         
            "$or": [    
              {             
                "tokens.data.value": "鼬獾"
              },            
              {             
                "tokens.data.value": "鼬貛"
              }             
            ]           
          }
        ]       
      },
      {     
        "$and": [
          {         
            "tokens.data.key": "life-stage"
          },        
          {
            "tokens.data.value": "young"
          }         
        ]       
      }
    ]   
  },
  "
  ion": {
    "url": "$url",
    "projectTitle": "$projectTitle",
    "cameraLocation": "$cameraLocation"
  },
  "limit": 1000,
  "skip": 5000
}
  • response
{
  "ret": [
    {
      "type": "StillImage",
      "url": "string",
      "url_md5": "string",
      "multimedia_error_flag": false,
      "related_upload_sessions": [],
      "tokens": [
        {
          "token_id": "string",
          "token_error_flag": false,
          "species_shortTitlecut": "string",
          "description_level": "individual",
          "bbox": {
            "full_scope": true,
            "original_point": "topleft"
          },
          "meta": {
            "virtual_individual_id": "string",
            "virtual_part_id": "string"
          },
          "data": [
            {
              "key": "",
              "label": "",
              "value": "",
              "unit": "",
              "data_error_flag": false,
              "last_validated_timestamp": 0,
              "context": "camera-trap"
            }
          ]
        }
      ],
      "projectTitle": "string",
      "site": "string",
      "subSite": "",
      "cameraLocation": "string",
      "fullCameraLocationMd5": "string",
      "timezone": "string",
      "date_time_original": "string",
      "date_time_original_timestamp": 0,
      "year_original": "string",
      "month_original": "string",
      "day_original": "string",
      "hour_original": "string",
      "create_date": "string",
      "wgs84dec_x": 0,
      "wgs84dec_y": 0
    }
  ]
}

通知 WF 11.1, WF 11.2

需要先登入,才會得到完整的個人化資訊;否則只會看到系統通知(collection==Announcement)。 回傳的 collection 屬性對應到 MongoDB 的資料表。也提供使用者點選通知時,介面上應如何反應的依據。collection 為 UploadSession 者會多一個 status 屬性代表上傳結果。回傳結果預設照 modified 降冪排序。

  • endpoint GET /announcement/notifications
  • response
{
  "ret": [
    {
      "_id": "test_upload_session_02",
      "status": "ERROR",
      "modified": 1542706883.083,
      "created": 1541750624.016,
      "level": "WARNING",
      "message": "測試計畫1 臺東處-NULL<br/>TD03A 2018-01-01 00:00:00-2018-03-23 11:07:20",
      "collection": "UploadSession"
    },
    {
      "_id": "69d10deccf4b8f449204731df940ca57",
      "message": "(使用者) 回報相機異常:相機電量耗損過快<br/>測試計畫1 新竹-南庄30林班<br/>HC21A 2018/10/01-2018/11/16",
      "level": "WARNING",
      "modified": 1542563213.889,
      "created": 1542563213.889,
      "collection": "AbnormalData"
    },
    ...
    {
      "_id": "06fc82ba-2ea6-433e-9980-c5b9c7e04d44",
      "message": "系統今夜緊急維修,請暫停使用",
      "level": "WARNING",
      "created": 1541508803.35,
      "modified": 1541508803.35,
      "collection": "Announcement"
    },
    ...
  ]
}

聯絡我們 WF 12.2

  • endpoint /user-report/submit
  • post data
{
  "reportType": 問題回報/意見反饋,
  "reportContentType": 系統操作/帳號相關/計畫管理/檔案上傳/資料編輯/篩選及下載/其他問題,
  "description": 問題描述,
  "email": 電子郵件,
  "attachments": [上傳到S3的附件連結們,...]
}
  • response default db response

API documentation

V1

Legacy docs

Clone this wiki locally