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

第二階段

第三階段

第四階段