summaryrefslogtreecommitdiff
path: root/src/server/api
diff options
context:
space:
mode:
authorsyuilo <syuilotan@yahoo.co.jp>2019-05-17 19:56:47 +0900
committersyuilo <syuilotan@yahoo.co.jp>2019-05-17 19:56:47 +0900
commit380749051d1bdb63c667dd055f949f339c356e35 (patch)
tree230a35893f77c0c7ee05fab6fb3e7dfc0d65b8ff /src/server/api
parentUpdate API docs (diff)
downloadsharkey-380749051d1bdb63c667dd055f949f339c356e35.tar.gz
sharkey-380749051d1bdb63c667dd055f949f339c356e35.tar.bz2
sharkey-380749051d1bdb63c667dd055f949f339c356e35.zip
ページにいいねできるように
Diffstat (limited to 'src/server/api')
-rw-r--r--src/server/api/endpoints/i/page-likes.ts45
-rw-r--r--src/server/api/endpoints/pages/like.ts79
-rw-r--r--src/server/api/endpoints/pages/show.ts2
-rw-r--r--src/server/api/endpoints/pages/unlike.ts62
-rw-r--r--src/server/api/kinds.ts2
5 files changed, 189 insertions, 1 deletions
diff --git a/src/server/api/endpoints/i/page-likes.ts b/src/server/api/endpoints/i/page-likes.ts
new file mode 100644
index 0000000000..23bde74c99
--- /dev/null
+++ b/src/server/api/endpoints/i/page-likes.ts
@@ -0,0 +1,45 @@
+import $ from 'cafy';
+import { ID } from '../../../../misc/cafy-id';
+import define from '../../define';
+import { PageLikes } from '../../../../models';
+import { makePaginationQuery } from '../../common/make-pagination-query';
+
+export const meta = {
+ desc: {
+ 'ja-JP': '「いいね」したページ一覧を取得します。',
+ 'en-US': 'Get liked pages'
+ },
+
+ tags: ['account', 'pages'],
+
+ requireCredential: true,
+
+ kind: 'read:page-likes',
+
+ params: {
+ limit: {
+ validator: $.optional.num.range(1, 100),
+ default: 10
+ },
+
+ sinceId: {
+ validator: $.optional.type(ID),
+ },
+
+ untilId: {
+ validator: $.optional.type(ID),
+ },
+ }
+};
+
+export default define(meta, async (ps, user) => {
+ const query = makePaginationQuery(PageLikes.createQueryBuilder('like'), ps.sinceId, ps.untilId)
+ .andWhere(`like.userId = :meId`, { meId: user.id })
+ .leftJoinAndSelect('like.page', 'page');
+
+ const likes = await query
+ .take(ps.limit!)
+ .getMany();
+
+ return await PageLikes.packMany(likes, user);
+});
diff --git a/src/server/api/endpoints/pages/like.ts b/src/server/api/endpoints/pages/like.ts
new file mode 100644
index 0000000000..5a50bd6c6c
--- /dev/null
+++ b/src/server/api/endpoints/pages/like.ts
@@ -0,0 +1,79 @@
+import $ from 'cafy';
+import { ID } from '../../../../misc/cafy-id';
+import define from '../../define';
+import { ApiError } from '../../error';
+import { Pages, PageLikes } from '../../../../models';
+import { genId } from '../../../../misc/gen-id';
+
+export const meta = {
+ desc: {
+ 'ja-JP': '指定したページを「いいね」します。',
+ },
+
+ tags: ['pages'],
+
+ requireCredential: true,
+
+ kind: 'write:page-likes',
+
+ params: {
+ pageId: {
+ validator: $.type(ID),
+ desc: {
+ 'ja-JP': '対象のページのID',
+ 'en-US': 'Target page ID.'
+ }
+ }
+ },
+
+ errors: {
+ noSuchPage: {
+ message: 'No such page.',
+ code: 'NO_SUCH_PAGE',
+ id: 'cc98a8a2-0dc3-4123-b198-62c71df18ed3'
+ },
+
+ yourPage: {
+ message: 'You cannot like your page.',
+ code: 'YOUR_PAGE',
+ id: '28800466-e6db-40f2-8fae-bf9e82aa92b8'
+ },
+
+ alreadyLiked: {
+ message: 'The page has already been liked.',
+ code: 'ALREADY_LIKED',
+ id: 'cc98a8a2-0dc3-4123-b198-62c71df18ed3'
+ },
+ }
+};
+
+export default define(meta, async (ps, user) => {
+ const page = await Pages.findOne(ps.pageId);
+ if (page == null) {
+ throw new ApiError(meta.errors.noSuchPage);
+ }
+
+ if (page.userId === user.id) {
+ throw new ApiError(meta.errors.yourPage);
+ }
+
+ // if already liked
+ const exist = await PageLikes.findOne({
+ pageId: page.id,
+ userId: user.id
+ });
+
+ if (exist != null) {
+ throw new ApiError(meta.errors.alreadyLiked);
+ }
+
+ // Create like
+ await PageLikes.save({
+ id: genId(),
+ createdAt: new Date(),
+ pageId: page.id,
+ userId: user.id
+ });
+
+ Pages.increment({ id: page.id }, 'likedCount', 1);
+});
diff --git a/src/server/api/endpoints/pages/show.ts b/src/server/api/endpoints/pages/show.ts
index dd1dc9f255..e3d6e6a15f 100644
--- a/src/server/api/endpoints/pages/show.ts
+++ b/src/server/api/endpoints/pages/show.ts
@@ -70,5 +70,5 @@ export default define(meta, async (ps, user) => {
throw new ApiError(meta.errors.noSuchPage);
}
- return await Pages.pack(page);
+ return await Pages.pack(page, user);
});
diff --git a/src/server/api/endpoints/pages/unlike.ts b/src/server/api/endpoints/pages/unlike.ts
new file mode 100644
index 0000000000..49ad999b31
--- /dev/null
+++ b/src/server/api/endpoints/pages/unlike.ts
@@ -0,0 +1,62 @@
+import $ from 'cafy';
+import { ID } from '../../../../misc/cafy-id';
+import define from '../../define';
+import { ApiError } from '../../error';
+import { Pages, PageLikes } from '../../../../models';
+
+export const meta = {
+ desc: {
+ 'ja-JP': '指定したページの「いいね」を解除します。',
+ },
+
+ tags: ['pages'],
+
+ requireCredential: true,
+
+ kind: 'write:page-likes',
+
+ params: {
+ pageId: {
+ validator: $.type(ID),
+ desc: {
+ 'ja-JP': '対象のページのID',
+ 'en-US': 'Target page ID.'
+ }
+ }
+ },
+
+ errors: {
+ noSuchPage: {
+ message: 'No such page.',
+ code: 'NO_SUCH_PAGE',
+ id: 'a0d41e20-1993-40bd-890e-f6e560ae648e'
+ },
+
+ notLiked: {
+ message: 'You have not liked that page.',
+ code: 'NOT_LIKED',
+ id: 'f5e586b0-ce93-4050-b0e3-7f31af5259ee'
+ },
+ }
+};
+
+export default define(meta, async (ps, user) => {
+ const page = await Pages.findOne(ps.pageId);
+ if (page == null) {
+ throw new ApiError(meta.errors.noSuchPage);
+ }
+
+ const exist = await PageLikes.findOne({
+ pageId: page.id,
+ userId: user.id
+ });
+
+ if (exist == null) {
+ throw new ApiError(meta.errors.notLiked);
+ }
+
+ // Delete like
+ await PageLikes.delete(exist.id);
+
+ Pages.decrement({ id: page.id }, 'likedCount', 1);
+});
diff --git a/src/server/api/kinds.ts b/src/server/api/kinds.ts
index 99c3795589..76d5a8a61a 100644
--- a/src/server/api/kinds.ts
+++ b/src/server/api/kinds.ts
@@ -21,4 +21,6 @@ export const kinds = [
'write:votes',
'read:pages',
'write:pages',
+ 'write:page-likes',
+ 'read:page-likes',
];