# 想像朋友寫作會暗網 API ## URL Path Documentation ### Root Path: /api/v1 /v1/users /v1/events /v1/works ### User | 說明 | Method | Path | | -------- | -------- | -------- | | 註冊使用者 | POST | /users/register | | 登入使用者 | POST | /users/login | | 取得所有使用者 | GET | /users | | 取得自己的資料 | GET | /users/me | | 變更自己的資料 | PATCH | /users/me | | 變更自己的密碼 | PATCH | /users/updatePassword | | 取得單一使用者 | GET | /users/:username | | 變更單一使用者資料 | PATCH | /users/:username | | 顯示帳號和暱稱搜尋結果 | GET | /search | | 修改自己的收信時機 | PATCH | /myEmailTime | ### Event | 說明 | Method | Path | Params | | -------- | -------- | -------- | - | | 創立活動 | POST | /events/add | | | 刪除活動 | GET | /events/delete/:id | | | 編輯活動 | PATCH | /events/:id | | | 取得所有活動 | GET | /events | | | 取得單一活動 | GET | /events/:id | | | 取得單一活動參加者 | GET | /events/participants/:id | | | 報名活動 | POST | /events/sign-up/:id | | | 取消報名活動 | GET | /events/cancel-sign-up/:id | | ### Work | 說明 | Method | Path | Params | | -------- | -------- | -------- | - | | 新增稿件 | POST | /works/add | | | 刪除稿件 | GET | /works/delete/:id | | | 編輯稿件 | PATCH | /works/:id | | | 取得所有稿件 | GET | /works | | | 取得單一稿件 | GET | /works/:id | | | 搜尋 tags 結果 | GET | /works/tags/search | | ## URL Path Documentation ### 身分認證 本 server 使用 JWT 進行身分驗證,登入成功會獲得一組 token,之後將該 token 帶在 HTTP Request header 中的 authorization 欄位進行驗證。以下以 `me` 的 request 為範例: ```js fetch('http://localhost:3001/v1/users/me', { headers: { 'authorization': 'Bearer eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InY2MTI2NSIsImlhdCI6MTYwOTYxMzI2M30.szKHap8EUz03YG7sZffGqht-bX0Gh19P8--o-oaOR1Y' } }) .then(res => res.json()) .then(data => console.log(data)) ``` ### User #### query `適用:`取得所有使用者資料、取得自己資料、取得特定使用者資料。 ``` _offset:預設 0 _limit:預設 10 _sort:預設 DESC _order:預設 session expand 沒有預設,想拿取該資料設定成 true 即可。 _expand_host _expand_participate _expand_works _expand_readRecord _expand_emailTime _expand_all ``` #### 註冊使用者 Request Example ```json { "username": "v61265", "password": "123", "againPassword": "123", "nickname": "生菜", "email": "v61265@gmail.com", "session": "gs_11" } ``` Response Example ```json { "ok": 1, "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InY2MTI2NSIsImlhdCI6MTYwOTYxMzI2M30.szKHap8EUz03YG7sZffGqht-bX0Gh19P8--o-oaOR1Y" } ``` #### 登入使用者 Request Example ```json { "username": "v61265", "password": "123", } ``` Response Example ```json { "ok": 1, "token": "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VybmFtZSI6InY2MTI2NSIsImlhdCI6MTYwOTQwMTY2NX0.0467Pr2wgckza0gApSzayi11RMmxb7DR64YVLQlwn10" } ``` #### 取得所有使用者 Response Example ```json { "ok": 1, "users": [ { "id": 2, "username": "zoe_ho", "nickname": "zoe", "session": "if_02", "contact": "https://example.com", "portrait": "https://ppt.cc/fni7cx@.jpg", "role": "admin", "record": "", "description": "若能夠欣賞到Zoe的美,相信我們一定會對Zoe改觀。問題的關鍵究竟為何?做好Zoe這件事,可以說已經成為了全民運動。", "isDeleted": false, "createdAt": "2021-01-09T07:33:21.000Z", "updatedAt": "2021-01-09T07:33:21.000Z" }, { "id": 5, "username": "zangwang", "nickname": "張妄", "session": "if_01", "contact": "https://example.com", "portrait": "https://ppt.cc/fni7cx@.jpg", "role": "active-member", "record": "", "description": "老舊的想法已經過時了。儘管張妄看似不顯眼,卻佔據了我的腦海。", "isDeleted": false, "createdAt": "2021-01-09T07:33:21.000Z", "updatedAt": "2021-01-09T07:33:21.000Z" }, ] } ``` #### 取得自己資料 Response Example ```json { "ok": 1, "user": { "id": 8, "username": "v61265", "email": "v61265@gmail.com", "nickname": "生菜", "session": "gs_11", "contact": null, "portrait": "https://ppt.cc/fni7cx@.jpg", "role": "frozen", "record": null, "description": null, "isDeleted": false, "createdAt": "2021-01-13T06:03:58.000Z", "updatedAt": "2021-01-13T06:03:58.000Z" } } ``` #### 更改自己資料 後端會先去撈原本資料,因此只要輸入欲更改部分就好。 Request Example ```json { "email": "update@gmail.com", "description": "生菜忽然動了一下", } ``` Response Example ```json { ok: 1, message: "更新成功", } ``` #### 更改自己密碼 Request Example ```json { "oldPassword": "123" "newPassword": "456" "againPassword": "456" } ``` Response Example ```json { ok: 1, message: "更新成功", } ``` #### 取得特定使用者 Response Example ```json { "ok": 1, "user": { "id": 2, "username": "zoe_ho", "nickname": "zoe", "session": "if_02", "contact": "https://example.com", "portrait": "https://ppt.cc/fni7cx@.jpg", "role": "admin", "record": "", "description": "若能夠欣賞到Zoe的美,相信我們一定會對Zoe改觀。問題的關鍵究竟為何?做好Zoe這件事,可以說已經成為了全民運動。", "isDeleted": false, "createdAt": "2021-01-09T07:33:21.000Z", "updatedAt": "2021-01-09T07:33:21.000Z" } } ``` #### 更改特定使用者 後端會先去撈原本資料,因此只要輸入欲更改部分就好。 Request Example ```json { "role": "admin" } ``` Response Example ```json { ok: 1, message: "更新成功", } ``` #### 顯示帳號和暱稱搜尋結果 query: ``` _offset:預設 0 _limit:預設 10 _sort:預設 DESC _order:預設 session _keyword:要搜尋的關鍵字 ``` Response Example ```json { "ok": 1, "users": [ { "username": "zoe_ho", "nickname": "zoe", "portrait": "https://ppt.cc/fni7cx@.jpg" }, { "username": "Leiiiiiii", "nickname": "Lei", "portrait": "https://ppt.cc/fni7cx@.jpg" }, { "username": "yongchen", "nickname": "yongchen", "portrait": "https://ppt.cc/fni7cx@.jpg" } ] } ``` #### 修改自己的收信時機 *不會* 從資料庫撈資料,請確保每個時機都被傳入。 Request Example ```json { "eventCreated": true, "eventUpdated": false, "eventRemain": true, "eventSignUp": false, "eventAlternate": false, "postSuccess": true, "postComment": false, } ``` Response Example ```json { ok: 1, message: "更新成功", } ``` ### Event #### 創立活動 會檢查的必填欄位: `title, presentAttendeesLimit, workLimit, time, openWorksTime, location` Request Example ``` { "title": "活動標題" "description": "描述是非必填欄位喔", "picture": "example.jpg", "presentAttendeesLimit": 12, "workLimit": 4, "time": "2021-01-06T08:18:34.000Z", "openWorksTime": "2021-01-06T08:18:34.000Z", "location": "某個地方", "meetingLink": "http:example", "referance: null, } ``` Response Example ``` { "ok": 1, "id": 7 } ``` #### 刪除活動 Response Example ``` { "ok": 1 } ``` #### 編輯活動 後端**不**會先去撈原本資料,因此**請連原本的資料都帶上**。 Request Example ``` { "title": "活動標題" "description": "更改一點描述", "picture": "example.jpg", "presentAttendeesLimit": 12, "workLimit": 4, "time": "2021-01-06T08:18:34.000Z", "openWorksTime": "2021-01-06T08:18:34.000Z", "location": "某個地方", "meetingLink": "http:example", "referance: null, } ``` Response Example ``` { "ok": 1, "message": "更新成功" } ``` #### 取得所有活動(2021/2/12 更新) 篩選器: ``` _offset:預設 0 _limit:預設 10 _sort:預設 DESC _order:預設 createdAt status: 預設取得所有資料,`history` 可得歷史紀錄、 `coming` 可得即將舉辦的活動。 expand 沒有預設,想拿取該資料設定成 true 即可。 _expand_host _expand_participants _expand_works _expand_all ``` Response Example ``` { "ok": 1, "data": { "events": [ { "id": 6, "title": "123", "description": null, "picture": "https://ppt.cc/fvNpnx@.jpg", "hostId": 1, "presentAttendeesLimit": 4, "workLimit": 4, "time": "2021-01-08T02:02:42.000Z", "openWorksTime": "2021-01-06T08:18:34.000Z", "location": "rrrr", "meetingLink": null, "referance": null, "isDeleted": false, "createdAt": "2021-01-09T08:41:18.000Z", "updatedAt": "2021-01-09T08:41:18.000Z" }, { "id": 1, "title": "第一場批鬥會", "description": "富爾曼諾夫說過一句經典的名言,一個人就是一種典型。但願各位能從這段話中獲得心靈上的滋長。對第一場批鬥會進行深入研究,在現今時代已經無法避免了。在這種不可避免的衝突下,我們必須解決這個問題。看看別人,再想想自己,會發現問題的核心其實就在你身旁。", "picture": "https://ppt.cc/fvNpnx@.jpg", "hostId": 1, "presentAttendeesLimit": 3, "workLimit": 4, "time": "2021-01-09T07:33:21.000Z", "openWorksTime": "2021-01-09T07:33:21.000Z", "location": "松山南京小樹屋 201", "meetingLink": null, "referance": null, "isDeleted": false, "createdAt": "2021-01-09T07:33:21.000Z", "updatedAt": "2021-01-09T07:33:21.000Z" }, ] } } ``` #### 取得單一活動 Response Example ```json= { "ok": 1, "data": { "event": [ { "id": 2, "title": "再辦一場批鬥會", "description": "如果此時我們選擇忽略再辦一場批鬥會,那後果可想而知。話雖如此,我們卻也不能夠這麼篤定。/n/n再辦一場批鬥會究竟是怎麼樣的存在,始終是個謎題。", "picture": "https://ppt.cc/fvNpnx@.jpg", "hostId": 2, "presentAttendeesLimit": 10, "workLimit": 4, "time": "2021-01-09T07:33:21.000Z", "openWorksTime": "2021-01-09T07:33:21.000Z", "location": "生菜家 (?)", "meetingLink": null, "referance": null, "isDeleted": false, "createdAt": "2021-01-09T07:33:21.000Z", "updatedAt": "2021-01-09T07:33:21.000Z", "Works": [ { "id": 2, "title": "晚餐要吃什麼", "authorId": 3, "eventId": 2, "category": "other", "open": false, "anonymous": true, "content": " 第歐根尼說過一句著名的話,太陽也光顧污穢之地,但並沒有因此而被玷污。想必各位已經看出了其中的端倪。朱耀燮告訴我們,在愛情方面,女人可能是很堅強的,也可能是很懦弱的。要么是愛別人,要么是接受別人的愛,一旦陷入情網之後,就是有人命令她朝火裡鑽,她也會心甘情願服從的。這段話雖短,卻足以改變人類的歷史。回過神才發現,思考晚餐要吃什麼的存在意義,已讓我廢寢忘食。我們都很清楚,這是個嚴謹的議題。儘管如此,我們仍然需要對晚餐要吃什麼保持懷疑的態度。現在,正視晚餐要吃什麼的問題,是非常非常重要的。因為,其實,若思緒夠清晰,那麼晚餐要吃什麼也就不那麼複雜了。晚餐要吃什麼的出現,必將帶領人類走向更高的巔峰。可是,即使是這樣,晚餐要吃什麼的出現仍然代表了一定的意義。俗話說的好,掌握思考過程,也就掌握了晚餐要吃什麼。每個人都不得不面對這些問題。在面對這種問題時,務必詳細考慮晚餐要吃什麼的各種可能。如果仔細思考晚餐要吃什麼,會發現其中蘊含的深遠意義。深入的探討晚餐要吃什麼,是釐清一切的關鍵。我們不得不相信,希臘曾經說過,無論誰,只要他還活著,你就不能稱他是幸福的。這把視野帶到了全新的高度。泰戈爾曾提出,你若愛她,讓你的愛像陽光一樣包圍她,並且給她自由。這啟發了我。/n/n探討晚餐要吃什麼時,如果發現非常複雜,那麼想必不簡單。", "version": 1, "isDeleted": false, "createdAt": "2021-01-09T07:33:21.000Z", "updatedAt": "2021-01-09T07:33:21.000Z", "EventId": 2 } ], "host": { "id": 2, "username": "zoe_ho", "password": "$2b$10$IbVzlvVo56xaiYkBTl2WpesHbQcba5Bjf5wh7lzUG2yH50k6IwO2W", "email": "zeo@gmail.com", "nickname": "zoe", "session": "if_02", "contact": "https://example.com", "portrait": "https://ppt.cc/fni7cx@.jpg", "role": "admin", "record": "", "description": "若能夠欣賞到Zoe的美,相信我們一定會對Zoe改觀。問題的關鍵究竟為何?做好Zoe這件事,可以說已經成為了全民運動。", "isDeleted": false, "createdAt": "2021-01-09T07:33:21.000Z", "updatedAt": "2021-01-09T07:33:21.000Z" }, "participant": [ { "id": 6, "username": "yongchen", "password": "$2b$10$IbVzlvVo56xaiYkBTl2WpesHbQcba5Bjf5wh7lzUG2yH50k6IwO2W", "email": "yongchen@gmail.com", "nickname": "yongchen", "session": "gs_04", "contact": "https://example.com", "portrait": "https://ppt.cc/fni7cx@.jpg", "role": "active-member", "record": "", "description": "若無法徹底理解yongchen,恐怕會是人類的一大遺憾。", "isDeleted": false, "createdAt": "2021-01-09T07:33:21.000Z", "updatedAt": "2021-01-09T07:33:21.000Z", "User_Events": { "createdAt": "2021-01-09T07:33:21.000Z", "updatedAt": "2021-01-09T07:33:21.000Z", "EventId": 2, "UserId": 6 } } ] } ] } } ``` #### 取得活動參加者名單 Response Example ```json= { "ok": 1, "participants": { "present": [ 1, 3 ], "online": [ 4 ], "alternative": [] } } ``` #### 報名活動 Request Example ``` { "type": "present" } ``` Response Example ``` { "ok": 1, "message": "報名成功!" } ``` #### 取消報名活動 Response Example ``` { "ok": 1, "message": "取消報名成功!" } ``` ### Work #### 創立稿件 會檢查的必填欄位: `title, eventId, category, open, anonymous` Request Example ``` { "title": "我是標題", "content": "我是內容", "eventId": 2, "category": "other", "open": true, "anonymous": false, } ``` Response Example ``` { "ok": 1, "id": 7 } ``` #### 刪除稿件 Response Example ``` { "ok": 1 } ``` #### 編輯稿件 後端**不**會先去撈原本資料,因此**請連原本的資料都帶上**。 Request Example ``` { "title": "我是標題", "content": "更改內容", "eventId": 2, "category": "other", "open": true, "anonymous": false, } ``` Response Example ``` { "ok": 1, } ``` #### 取得所有活動 篩選器: ``` _offset:預設 0 _limit:預設 10 _sort:預設 DESC _order:預設 createdAt // expand 沒有預設,想拿取該資料設定成 true 即可。 _expand_author _expand_readers _expand_event _expand_tags _expand_all // condition authorId eventId ``` Response Example ```json { "ok": 1, "works": [ { "id": 1, "title": "這是第一篇 demo", "authorId": 3, "eventId": 1, "category": "novel", "open": false, "anonymous": false, "content": "若能夠欣賞到這是第一篇 demo的美,相信我們一定會對這是第一篇 demo改觀。這是第一篇 demo,發生了會如何,不發生又會如何。那麼,本人也是經過了深思熟慮,在每個日日夜夜思考這個問題。對於這是第一篇 demo,我們不能不去想,卻也不能走火入魔。面對如此難題,我們必須設想周全。這是第一篇 demo似乎是一種巧合,但如果我們從一個更大的角度看待問題,這似乎是一種不可避免的事實。這樣看來,從這個角度來看,這是不可避免的。/n/n一般來講,我們都必須務必慎重的考慮考慮。在這種不可避免的衝突下,我們必須解決這個問題。如果仔細思考這是第一篇 demo,會發現其中蘊含的深遠意義。世界上若沒有這是第一篇 demo,對於人類的改變可想而知。我想,把這是第一篇 demo的意義想清楚,對各位來說並不是一件壞事。看看別人,再想想自己,會發現問題的核心其實就在你身旁。這是第一篇 demo勢必能夠左右未來。波爾克說過一句很有意思的話,讀書而不思考,等於吃飯而不消化。這啟發了我。斯特林堡說過一句發人省思的話,生活的目的究竟是什麼?是生活本身!除把生命維持到死以處不會再有其他任務。人因此而獲得維持生命的力量。這句話看似簡單,但其中的陰鬱不禁讓人深思。", "version": 1, "isDeleted": false, "createdAt": "2021-01-09T09:37:58.000Z", "updatedAt": "2021-01-09T09:37:58.000Z" }, { "id": 2, "title": "晚餐要吃什麼", "authorId": 3, "eventId": 2, "category": "other", "open": false, "anonymous": true, "content": " 第歐根尼說過一句著名的話,太陽也光顧污穢之地,但並沒有因此而被玷污。想必各位已經看出了其中的端倪。朱耀燮告訴我們,在愛情方面,女人可能是很堅強的,也可能是很懦弱的。要么是愛別人,要么是接受別人的愛,一旦陷入情網之後,就是有人命令她朝火裡鑽,她也會心甘情願服從的。這段話雖短,卻足以改變人類的歷史。回過神才發現,思考晚餐要吃什麼的存在意義,已讓我廢寢忘食。我們都很清楚,這是個嚴謹的議題。儘管如此,我們仍然需要對晚餐要吃什麼保持懷疑的態度。現在,正視晚餐要吃什麼的問題,是非常非常重要的。因為,其實,若思緒夠清晰,那麼晚餐要吃什麼也就不那麼複雜了。晚餐要吃什麼的出現,必將帶領人類走向更高的巔峰。可是,即使是這樣,晚餐要吃什麼的出現仍然代表了一定的意義。俗話說的好,掌握思考過程,也就掌握了晚餐要吃什麼。每個人都不得不面對這些問題。在面對這種問題時,務必詳細考慮晚餐要吃什麼的各種可能。如果仔細思考晚餐要吃什麼,會發現其中蘊含的深遠意義。深入的探討晚餐要吃什麼,是釐清一切的關鍵。我們不得不相信,希臘曾經說過,無論誰,只要他還活著,你就不能稱他是幸福的。這把視野帶到了全新的高度。泰戈爾曾提出,你若愛她,讓你的愛像陽光一樣包圍她,並且給她自由。這啟發了我。/n/n探討晚餐要吃什麼時,如果發現非常複雜,那麼想必不簡單。", "version": 1, "isDeleted": false, "createdAt": "2021-01-09T09:37:58.000Z", "updatedAt": "2021-01-09T09:37:58.000Z" }, { "id": 3, "title": "這是第一篇 demo", "authorId": 3, "eventId": 1, "category": "novel", "open": true, "anonymous": false, "content": "若能夠欣賞到這是第一篇 demo的美,相信我們一定會對這是第一篇 demo改觀。這是第一篇 demo,發生了會如何,不發生又會如何。那麼,本人也是經過了深思熟慮,在每個日日夜夜思考這個問題。對於這是第一篇 demo,我們不能不去想,卻也不能走火入魔。面對如此難題,我們必須設想周全。這是第一篇 demo似乎是一種巧合,但如果我們從一個更大的角度看待問題,這似乎是一種不可避免的事實。這樣看來,從這個角度來看,這是不可避免的。/n/n一般來講,我們都必須務必慎重的考慮考慮。在這種不可避免的衝突下,我們必須解決這個問題。如果仔細思考這是第一篇 demo,會發現其中蘊含的深遠意義。世界上若沒有這是第一篇 demo,對於人類的改變可想而知。我想,把這是第一篇 demo的意義想清楚,對各位來說並不是一件壞事。看看別人,再想想自己,會發現問題的核心其實就在你身旁。這是第一篇 demo勢必能夠左右未來。波爾克說過一句很有意思的話,讀書而不思考,等於吃飯而不消化。這啟發了我。斯特林堡說過一句發人省思的話,生活的目的究竟是什麼?是生活本身!除把生命維持到死以處不會再有其他任務。人因此而獲得維持生命的力量。這句話看似簡單,但其中的陰鬱不禁讓人深思。", "version": 1, "isDeleted": false, "createdAt": "2021-01-09T09:37:58.000Z", "updatedAt": "2021-01-09T09:37:58.000Z" } ] } ``` #### 取得單一活動 (2022/02/22 更新) Response Example ```json= { "ok": 1, "work": { "id": 2, "title": "晚餐要吃什麼", "authorId": 3, "eventId": 2, "category": "other", "open": false, "anonymous": true, "content": " 第歐根尼說過一句著名的話,太陽也光顧污穢之地,但並沒有因此而被玷污。想必各位已經看出了其中的端倪。朱耀燮告訴我們,在愛情方面,女人可能是很堅強的,也可能是很懦弱的。要么是愛別人,要么是接受別人的愛,一旦陷入情網之後,就是有人命令她朝火裡鑽,她也會心甘情願服從的。這段話雖短,卻足以改變人類的歷史。回過神才發現,思考晚餐要吃什麼的存在意義,已讓我廢寢忘食。我們都很清楚,這是個嚴謹的議題。儘管如此,我們仍然需要對晚餐要吃什麼保持懷疑的態度。現在,正視晚餐要吃什麼的問題,是非常非常重要的。因為,其實,若思緒夠清晰,那麼晚餐要吃什麼也就不那麼複雜了。晚餐要吃什麼的出現,必將帶領人類走向更高的巔峰。可是,即使是這樣,晚餐要吃什麼的出現仍然代表了一定的意義。俗話說的好,掌握思考過程,也就掌握了晚餐要吃什麼。每個人都不得不面對這些問題。在面對這種問題時,務必詳細考慮晚餐要吃什麼的各種可能。如果仔細思考晚餐要吃什麼,會發現其中蘊含的深遠意義。深入的探討晚餐要吃什麼,是釐清一切的關鍵。我們不得不相信,希臘曾經說過,無論誰,只要他還活著,你就不能稱他是幸福的。這把視野帶到了全新的高度。泰戈爾曾提出,你若愛她,讓你的愛像陽光一樣包圍她,並且給她自由。這啟發了我。/n/n探討晚餐要吃什麼時,如果發現非常複雜,那麼想必不簡單。", "version": 1, "isDeleted": false, "createdAt": "2021-01-09T09:37:58.000Z", "updatedAt": "2021-01-09T09:37:58.000Z" } } ``` #### 顯示 Tag 搜尋結果 query: ``` _offset:預設 0 _limit:預設 10 _sort:預設 DESC _order:預設 createdAt _keyword:要搜尋的關鍵字 ``` Response Example ```json { "ok": 1, "tags": [ { "id": 5, "content": "奇幻小說", "createdAt": "2021-01-09T07:33:21.000Z", "updatedAt": "2021-01-09T07:33:21.000Z" } ] } ```