API 實作階段規格書¶
分四階段為 APP 實作 API 。此四階段也是網站上 js 實作順序,惟 js 實作階段應 領先 APP 。
API
- 帳號相關
- (DONE) APP Sha1 Digest Login
- (DONE) APP/js 以 email 創建用戶
- js 啟用用戶角色(Casting: 村里長、村里幹事、代表、議員)
- APP/js 修改用戶資料
- 任務相關
- (DONE) APP/js 創建任務
- (DONE) APP 更新附件上傳狀態(save_done)
- (DONE) APP/js 更新任務
- APP/js 創建意見
- js 上傳附件(S3 那邊需要開放 CROS)
- (DONE) APP/js 查詢任務
第一階段¶
APP’s Sha1 Digest Login Authentication¶
tastypie 在認證架構上,可使用 MultiAuthentication 方式,串連多種認證方式,在本系統中,只有 UserResource 可使用 Sha1DigestLoginAuthentication + SessionAuthentication + ApiKeyAuthentication ,其他 Resources 皆只能使用 SessionAuthentication 及 ApiKeyAuthentication 。
APP Login: GET UserResource¶
APP 傳入 api_key_id, salt_id, api_key_verify 至 UserResource 時,中間會經過 Sha1DigestLoginAuthentication ,通過 api_key_verify 比對後,該 session 就會被 auth.login(request) ,詳見:
整個 UserResource 在處理完 GET 程序後回傳時,將在 HTTP headers 帶入 csrftoken 及 sessionid 資訊,其 HTTP body 如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | {
"meta": {
"limit": 10,
"next": null,
"offset": 0,
"previous": null,
"total_count": 1
},
"objects": [
{
"date_joined": "2014-06-06T13:31:30.065000",
"email": "hoamon+magpieapp@ho600.com",
"first_name": "webmaster",
"id": 605,
"last_login": "2014-06-18T15:14:44.502785",
"last_name": "",
"resource_uri": "/api/lastest/auth/user/605/",
"username": "WEBMASTER.app"
}
]
}
|
APP 以 Google Play 帳號創建用戶: POST UserResource¶
APP 傳入 salt_id, email_of_google_play 至 UserResource 時,中間會經過 Sha1DigestLoginAuthentication ,通過 app_key_verify 比對後,即創建用戶,若已創建,則直接回傳用戶資料,詳見:
其回傳的 HTTP body 如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | {
"api_key": {
"id": 1601,
"key": "0acb8cd02e35f6ee3944285cac23192c330bc6fc"
},
"date_joined": "2014-06-18T15:19:19.669140",
"email": "magpie_user_1403105258@gmail.com",
"first_name": "",
"id": 1601,
"last_login": "2014-06-18T15:19:19.669110",
"last_name": "",
"resource_uri": "/api/lastest/auth/user/1601/",
"username": "magpie_user_1403105258@gmail.c"
}
|
APP/js 創建 Ticket: POST TicketResource¶
主要操作 File, Ticket Model 的資料,使用函式為 TicketResource.obj_create 。
創建成功後, TicketResource 回傳的 HTTP body :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 | {
"can_comment": false,
"cluster": {
"create_time": "2014-06-06T13:19:03.224000",
"id": 1601,
"is_suspend": false,
"name": "Local Affair",
"resource_uri": "/api/lastest/cluster/1601/",
"slag": ".",
"update_time": "2014-06-06T13:19:03.224000"
},
"content": "Whatever test at 2014-06-29 03:30:48.881906",
"create_time": "2014-06-29T03:30:50.336727",
"creator": {
"date_joined": "2014-06-06T13:31:30.065000",
"email": "hoamon+magpieapp@ho600.com",
"first_name": "webmaster",
"id": 605,
"last_login": "2014-06-29T03:30:48.739071",
"last_name": "",
"resource_uri": "/api/lastest/auth/user/605/",
"username": "WEBMASTER.app"
},
"id": 6,
"in_working": true,
"inspected_time": null,
"is_public": false,
"is_suspend": false,
"kind": null,
"latitude": 24.12058206,
"longitude": 120.67864537,
"mail_key": "VYKW",
"main_picture": "/api/lastest/file/17/",
"operator": {
"date_joined": "2014-06-06T13:31:30.065000",
"email": "hoamon+magpieapp@ho600.com",
"first_name": "webmaster",
"id": 605,
"last_login": "2014-06-29T03:30:48.739071",
"last_name": "",
"resource_uri": "/api/lastest/auth/user/605/",
"username": "WEBMASTER.app"
},
"pictures": [
{
"authentication_absolute_url": "https://s3-us-west-2.amazonaws.com:443/test-magpie006ewq/test/ticket/0/0/6/6/pictures/16/20140629033048-9591928058.jpg?AWSAccessKeyId=AKIAIUMQZW7ZYK7ZWZ5A&Expires=1404617450&Signature=lVyIy9A8%2FECxh2E2aRXHE0pc%2By8%3D",
"create_time": "2014-06-29T03:30:50.291846",
"domain": {
"id": 1598,
"location": "s3-us-west-2.amazonaws.com",
"name": "test-magpie",
"port": "443",
"prefix": "/test-magpie006ewq/test",
"protocol": "https",
"resource_uri": "/api/lastest/domain/1598/"
},
"ext": "jpg",
"extra_attrs": "",
"has_thumb": false,
"id": 16,
"is_suspend": false,
"name": "20140629033048-9591928058",
"note": "",
"resource_uri": "/api/lastest/file/16/",
"save_done": false,
"size": 0,
"update_time": "2014-06-29T03:30:50.361831",
"url_dir": "ticket/0/0/6/6/pictures/16"
},
{
"authentication_absolute_url": "https://s3-us-west-2.amazonaws.com:443/test-magpie006ewq/test/ticket/0/0/6/6/pictures/17/20140629033048-8303573028.jpg?AWSAccessKeyId=AKIAIUMQZW7ZYK7ZWZ5A&Expires=1404617450&Signature=gS6Yu0fdqOPKcEXtm5UV5%2Bwca5E%3D",
"create_time": "2014-06-29T03:30:50.297961",
"domain": {
"id": 1598,
"location": "s3-us-west-2.amazonaws.com",
"name": "test-magpie",
"port": "443",
"prefix": "/test-magpie006ewq/test",
"protocol": "https",
"resource_uri": "/api/lastest/domain/1598/"
},
"ext": "jpg",
"extra_attrs": "",
"has_thumb": false,
"id": 17,
"is_suspend": false,
"name": "20140629033048-8303573028",
"note": "",
"resource_uri": "/api/lastest/file/17/",
"save_done": false,
"size": 0,
"update_time": "2014-06-29T03:30:50.364624",
"url_dir": "ticket/0/0/6/6/pictures/17"
},
{
"authentication_absolute_url": "https://s3-us-west-2.amazonaws.com:443/test-magpie006ewq/test/ticket/0/0/6/6/pictures/18/20140629033048-7126798509.jpg?AWSAccessKeyId=AKIAIUMQZW7ZYK7ZWZ5A&Expires=1404617450&Signature=pVHNoZtSNrJ%2B1LbjWbeCi5BQUoU%3D",
"create_time": "2014-06-29T03:30:50.302083",
"domain": {
"id": 1598,
"location": "s3-us-west-2.amazonaws.com",
"name": "test-magpie",
"port": "443",
"prefix": "/test-magpie006ewq/test",
"protocol": "https",
"resource_uri": "/api/lastest/domain/1598/"
},
"ext": "jpg",
"extra_attrs": "",
"has_thumb": false,
"id": 18,
"is_suspend": false,
"name": "20140629033048-7126798509",
"note": "",
"resource_uri": "/api/lastest/file/18/",
"save_done": false,
"size": 0,
"update_time": "2014-06-29T03:30:50.367220",
"url_dir": "ticket/0/0/6/6/pictures/18"
}
],
"principal": null,
"resource_uri": "/api/lastest/ticket/6/",
"status": {
"id": 1,
"resource_uri": "/api/lastest/ho600_lib/option/1/",
"swarm": "ticket-status",
"value": "initial"
},
"tape_content": "",
"title": "",
"update_time": "2014-06-29T03:30:50.336754",
"village": {
"id": 4098,
"name": "\u7a4d\u5584\u91cc",
"resource_uri": "/api/lastest/area/4098/"
}
}
|
APP 更新附件上傳狀態(save_done): PATCH FileResource¶
當 APP 自行將相片、錄音檔上傳至 S3 後,就需再以 PATCH 連線更新本系統的 File.save_done 欄位。這樣本系統才知道有圖檔給使用者。方法請見:
APP/js 更新任務: PATCH TicketResource¶
APP/js 查詢任務: GET TicketResource¶
基本上,以個人角色先過濾可搜尋到的 Ticket ,之後再依 APP/js 傳來的 query_string 作更細的篩選。
query_string 可下的參數:
js 啟用村里長、村里幹事、議員帳戶: PATCH RoleResource¶
#TODO