From b22ef22a357031c2706d8914ba8f5d854e5caba9 Mon Sep 17 00:00:00 2001 From: zych1751 Date: Sun, 14 Mar 2021 21:00:04 +0900 Subject: [PATCH 1/3] finish api process after error send --- src/api/v1/auth.ts | 3 +++ src/api/v1/logoffedPostList.ts | 1 + src/api/v1/post.ts | 4 ++++ src/api/v1/user.ts | 2 ++ 4 files changed, 10 insertions(+) diff --git a/src/api/v1/auth.ts b/src/api/v1/auth.ts index 8e88625..5431b95 100644 --- a/src/api/v1/auth.ts +++ b/src/api/v1/auth.ts @@ -73,6 +73,7 @@ router.get('/login', async (request: express.Request, response: express.Response } } catch(e) { errorSend(response, 'internal_server_error', e); + return; } const data = { @@ -102,6 +103,7 @@ router.get('/login', async (request: express.Request, response: express.Response }); } catch(e) { errorSend(response, 'fail_create_token', null); + return; } response.json({ @@ -143,6 +145,7 @@ router.get('/access-token', async (request: express.Request, response: express.R }); } catch(e) { errorSend(response, 'cannot_find_token', null); + return; } // no token found from database diff --git a/src/api/v1/logoffedPostList.ts b/src/api/v1/logoffedPostList.ts index 06987c4..032d0eb 100644 --- a/src/api/v1/logoffedPostList.ts +++ b/src/api/v1/logoffedPostList.ts @@ -48,6 +48,7 @@ router.get('/recent-videos', async (request: express.Request, response: express. } } catch(e) { errorSend(response, 'fail_get_video', null); + return; } const recentVideoList = []; diff --git a/src/api/v1/post.ts b/src/api/v1/post.ts index cc1c821..012f378 100644 --- a/src/api/v1/post.ts +++ b/src/api/v1/post.ts @@ -87,6 +87,7 @@ router.get('/user-videos/:userId', async (request: express.Request, response: ex } } catch(e) { errorSend(response, 'not_found', null); + return; } const userVideos = []; @@ -143,6 +144,7 @@ router.post('/video', middleware.validateToken, async (request: express.Request, }); } catch(e) { errorSend(response, 'internal_server_error', e); + return; } return; }); @@ -192,6 +194,7 @@ router.put('/video', middleware.validateToken, async (request: express.Request, tagService.addVideoHasTag(videoPostId, tagIds); } catch(e) { errorSend(response, 'internal_server_error', null); + return; } response.json({ @@ -230,6 +233,7 @@ router.delete('/video', middleware.validateToken, async (request: express.Reques // video_has_tag will be deleted automatically by Database setting. } catch(e) { errorSend(response, 'internal_server_error', null); + return; } response.json({ diff --git a/src/api/v1/user.ts b/src/api/v1/user.ts index c3d0f01..6d5d8f6 100644 --- a/src/api/v1/user.ts +++ b/src/api/v1/user.ts @@ -38,6 +38,7 @@ router.put('/user-info', async (request: express.Request, response: express.Resp ); } catch(e) { errorSend(response, 'fail_update_user', null); + return; } response.json({ @@ -75,6 +76,7 @@ router.put('/profile-image', async (request: express.Request, response: express. ); } catch(e) { errorSend(response, 'fail_update_user', null); + return; } response.json({ From b7313a4ec2d8a1558de423cb1d95b0eb3c5043fc Mon Sep 17 00:00:00 2001 From: zych1751 Date: Sun, 14 Mar 2021 21:33:16 +0900 Subject: [PATCH 2/3] implement like api --- docs/yas_api_like_doc.md | 71 ++++++++++++++++++++++++++++++++++++++++ src/api/index.ts | 2 ++ src/api/v1/like.ts | 54 ++++++++++++++++++++++++++++++ src/model/Like.ts | 2 ++ 4 files changed, 129 insertions(+) create mode 100644 docs/yas_api_like_doc.md create mode 100644 src/api/v1/like.ts diff --git a/docs/yas_api_like_doc.md b/docs/yas_api_like_doc.md new file mode 100644 index 0000000..1b169bf --- /dev/null +++ b/docs/yas_api_like_doc.md @@ -0,0 +1,71 @@ +## POST - /v1/like/ + +set like + +#### Header + +| KEY | VALUE | REQUIRED | +| -------------- | ---------------- | -------- | +| Content-type | application/json | O | +| x-access-token | ACCESS_TOKEN | O | + + +#### Body Parameters + +| KEY | VALUE | REQUIRED | +| ----------- | ---------------- | -------- | +| videoId | VIDEO_ID | O | + + +#### URL Parameters + +X + + +#### Success Response + +Code: 200 (success) + +Content: +~~~ +{ + "message": "success" +} +~~~ + + + +## DELETE - /v1/like + +unset like + + +#### Header + +| KEY | VALUE | REQUIRED | +| -------------- | ---------------- | -------- | +| Content-type | application/json | O | +| x-access-token | ACCESS_TOKEN | O | + + +#### Body Parameters + +| KEY | VALUE | REQUIRED | +| ------- | -------- | -------- | +| videoId | VIDEO_ID | O | + + +#### URL Parameters + +X + + +#### Success Response + +Code: 200 (success) +Content: +~~~ +{ + "message": "success" +} +~~~ diff --git a/src/api/index.ts b/src/api/index.ts index cc0bc48..76eea09 100644 --- a/src/api/index.ts +++ b/src/api/index.ts @@ -3,6 +3,7 @@ import * as express from 'express'; import auth from './v1/auth'; import user from './v1/user'; import contents from './v1/contents'; +import like from './v1/like'; import post from './v1/post'; import logoffedPostList from './v1/logoffedPostList'; @@ -13,6 +14,7 @@ const router = express.Router(); router.use('/v1/auth', auth); router.use('/v1/user', middleware.validateToken, user); router.use('/v1/contents', middleware.validateToken, middleware.getGoogleAccessToken, contents); +router.use('/v1/like', middleware.validateToken, like); // handle middleware in post router.use('/v1/post', post); router.use('/v1/logoffed-post-list', logoffedPostList); diff --git a/src/api/v1/like.ts b/src/api/v1/like.ts new file mode 100644 index 0000000..a62f82a --- /dev/null +++ b/src/api/v1/like.ts @@ -0,0 +1,54 @@ +import * as express from 'express'; +import { Like } from '../../model/index'; +import { errorSend } from '../../error/errorUtil'; + +const router = express.Router(); + + +// post like (set like) +router.post('/', async (request: express.Request, response: express.Response) => { + const userId = request.body.userInfo.userId; + const videoId = request.body.videoId; + + try { + await Like.create({ + userId: userId, + videoId: videoId + }); + + response.json({ + message: 'success' + }); + } catch (e) { + errorSend(response, 'videoId is invalid', null); + } +}); + + +// delete like (unset like) +router.delete('/', async (request: express.Request, response: express.Response) => { + const userId = request.body.userInfo.userId; + const videoId = request.body.videoId; + + try { + const deleteCount = await Like.destroy({ + where: { + userId: userId, + videoId: videoId + } + }); + + if(deleteCount > 0) { + response.json({ + message: 'success' + }); + } else { + throw ''; + } + } catch (e) { + errorSend(response, 'videoId is invalid', null); + } +}); + + +export default router; \ No newline at end of file diff --git a/src/model/Like.ts b/src/model/Like.ts index ffeb108..e29c420 100644 --- a/src/model/Like.ts +++ b/src/model/Like.ts @@ -9,10 +9,12 @@ class Like extends Model { { userId: { type: DataTypes.INTEGER, + primaryKey: true, allowNull: false }, videoId: { type: DataTypes.INTEGER, + primaryKey: true, allowNull: false } }, From adcb5bf41e12d4e7339b086b7750f35d430c425b Mon Sep 17 00:00:00 2001 From: zych1751 Date: Mon, 15 Mar 2021 23:01:36 +0900 Subject: [PATCH 3/3] apply totalLikes in Video table --- src/api/v1/like.ts | 53 +++++++++++++++++++++++++++++++++++++++------- 1 file changed, 45 insertions(+), 8 deletions(-) diff --git a/src/api/v1/like.ts b/src/api/v1/like.ts index a62f82a..d1b78d5 100644 --- a/src/api/v1/like.ts +++ b/src/api/v1/like.ts @@ -1,6 +1,7 @@ import * as express from 'express'; -import { Like } from '../../model/index'; +import { Like, Video } from '../../model/index'; import { errorSend } from '../../error/errorUtil'; +import { Sequelize } from 'sequelize'; const router = express.Router(); @@ -15,12 +16,32 @@ router.post('/', async (request: express.Request, response: express.Response) => userId: userId, videoId: videoId }); + } + catch (e) { + errorSend(response, 'videoId is invalid', null); + return; + } + try { + Video.update({ + totalLikes: Sequelize.literal('totalLikes + 1') + }, { + where: { + id: videoId + } + }); response.json({ message: 'success' }); } catch (e) { - errorSend(response, 'videoId is invalid', null); + await Like.destroy({ + where: { + userId: userId, + videoId: videoId + } + }); + errorSend(response, 'fail to update video totalLikes', null); + return; } }); @@ -37,16 +58,32 @@ router.delete('/', async (request: express.Request, response: express.Response) videoId: videoId } }); - - if(deleteCount > 0) { - response.json({ - message: 'success' - }); - } else { + if(deleteCount == 0) { throw ''; } } catch (e) { errorSend(response, 'videoId is invalid', null); + return; + } + + try { + await Video.update({ + totalLikes: Sequelize.literal('totalLikes - 1') + }, { + where: { + id: videoId + } + }); + response.json({ + message: 'success' + }); + } catch (e) { + await Like.create({ + userId: userId, + videoId: videoId + }); + errorSend(response, 'fail to update video totalLikes', null); + return; } });