summaryrefslogtreecommitdiff
path: root/src/models
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/models
parentUpdate API docs (diff)
downloadmisskey-380749051d1bdb63c667dd055f949f339c356e35.tar.gz
misskey-380749051d1bdb63c667dd055f949f339c356e35.tar.bz2
misskey-380749051d1bdb63c667dd055f949f339c356e35.zip
ページにいいねできるように
Diffstat (limited to 'src/models')
-rw-r--r--src/models/entities/page-like.ts33
-rw-r--r--src/models/entities/page.ts5
-rw-r--r--src/models/index.ts2
-rw-r--r--src/models/repositories/page-like.ts26
-rw-r--r--src/models/repositories/page.ts52
5 files changed, 96 insertions, 22 deletions
diff --git a/src/models/entities/page-like.ts b/src/models/entities/page-like.ts
new file mode 100644
index 0000000000..ca84ece8fd
--- /dev/null
+++ b/src/models/entities/page-like.ts
@@ -0,0 +1,33 @@
+import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm';
+import { User } from './user';
+import { id } from '../id';
+import { Page } from './page';
+
+@Entity()
+@Index(['userId', 'pageId'], { unique: true })
+export class PageLike {
+ @PrimaryColumn(id())
+ public id: string;
+
+ @Column('timestamp with time zone')
+ public createdAt: Date;
+
+ @Index()
+ @Column(id())
+ public userId: User['id'];
+
+ @ManyToOne(type => User, {
+ onDelete: 'CASCADE'
+ })
+ @JoinColumn()
+ public user: User | null;
+
+ @Column(id())
+ public pageId: Page['id'];
+
+ @ManyToOne(type => Page, {
+ onDelete: 'CASCADE'
+ })
+ @JoinColumn()
+ public page: Page | null;
+}
diff --git a/src/models/entities/page.ts b/src/models/entities/page.ts
index f57ca8c7c3..05015ba175 100644
--- a/src/models/entities/page.ts
+++ b/src/models/entities/page.ts
@@ -95,6 +95,11 @@ export class Page {
})
public visibleUserIds: User['id'][];
+ @Column('integer', {
+ default: 0
+ })
+ public likedCount: number;
+
constructor(data: Partial<Page>) {
if (data == null) return;
diff --git a/src/models/index.ts b/src/models/index.ts
index e402d6723d..a63bb2c2b5 100644
--- a/src/models/index.ts
+++ b/src/models/index.ts
@@ -36,6 +36,7 @@ import { AuthSessionRepository } from './repositories/auth-session';
import { UserProfile } from './entities/user-profile';
import { HashtagRepository } from './repositories/hashtag';
import { PageRepository } from './repositories/page';
+import { PageLikeRepository } from './repositories/page-like';
export const Apps = getCustomRepository(AppRepository);
export const Notes = getCustomRepository(NoteRepository);
@@ -74,3 +75,4 @@ export const ReversiGames = getCustomRepository(ReversiGameRepository);
export const ReversiMatchings = getCustomRepository(ReversiMatchingRepository);
export const Logs = getRepository(Log);
export const Pages = getCustomRepository(PageRepository);
+export const PageLikes = getCustomRepository(PageLikeRepository);
diff --git a/src/models/repositories/page-like.ts b/src/models/repositories/page-like.ts
new file mode 100644
index 0000000000..3e7e803fdb
--- /dev/null
+++ b/src/models/repositories/page-like.ts
@@ -0,0 +1,26 @@
+import { EntityRepository, Repository } from 'typeorm';
+import { PageLike } from '../entities/page-like';
+import { Pages } from '..';
+import { ensure } from '../../prelude/ensure';
+
+@EntityRepository(PageLike)
+export class PageLikeRepository extends Repository<PageLike> {
+ public async pack(
+ src: PageLike['id'] | PageLike,
+ me?: any
+ ) {
+ const like = typeof src === 'object' ? src : await this.findOne(src).then(ensure);
+
+ return {
+ id: like.id,
+ page: await Pages.pack(like.page || like.pageId, me),
+ };
+ }
+
+ public packMany(
+ likes: any[],
+ me: any
+ ) {
+ return Promise.all(likes.map(x => this.pack(x, me)));
+ }
+}
diff --git a/src/models/repositories/page.ts b/src/models/repositories/page.ts
index 2293edbc0d..3b41420025 100644
--- a/src/models/repositories/page.ts
+++ b/src/models/repositories/page.ts
@@ -1,24 +1,30 @@
import { EntityRepository, Repository } from 'typeorm';
import { Page } from '../entities/page';
import { SchemaType, types, bool } from '../../misc/schema';
-import { Users, DriveFiles } from '..';
+import { Users, DriveFiles, PageLikes } from '..';
import { awaitAll } from '../../prelude/await-all';
import { DriveFile } from '../entities/drive-file';
+import { User } from '../entities/user';
+import { ensure } from '../../prelude/ensure';
export type PackedPage = SchemaType<typeof packedPageSchema>;
@EntityRepository(Page)
export class PageRepository extends Repository<Page> {
public async pack(
- src: Page,
+ src: Page['id'] | Page,
+ me?: User['id'] | User | null | undefined,
): Promise<PackedPage> {
+ const meId = me ? typeof me === 'string' ? me : me.id : null;
+ const page = typeof src === 'object' ? src : await this.findOne(src).then(ensure);
+
const attachedFiles: Promise<DriveFile | undefined>[] = [];
const collectFile = (xs: any[]) => {
for (const x of xs) {
if (x.type === 'image') {
attachedFiles.push(DriveFiles.findOne({
id: x.fileId,
- userId: src.userId
+ userId: page.userId
}));
}
if (x.children) {
@@ -26,7 +32,7 @@ export class PageRepository extends Repository<Page> {
}
}
};
- collectFile(src.content);
+ collectFile(page.content);
// 後方互換性のため
let migrated = false;
@@ -47,29 +53,31 @@ export class PageRepository extends Repository<Page> {
}
}
};
- migrate(src.content);
+ migrate(page.content);
if (migrated) {
- this.update(src.id, {
- content: src.content
+ this.update(page.id, {
+ content: page.content
});
}
return await awaitAll({
- id: src.id,
- createdAt: src.createdAt.toISOString(),
- updatedAt: src.updatedAt.toISOString(),
- userId: src.userId,
- user: Users.pack(src.user || src.userId),
- content: src.content,
- variables: src.variables,
- title: src.title,
- name: src.name,
- summary: src.summary,
- alignCenter: src.alignCenter,
- font: src.font,
- eyeCatchingImageId: src.eyeCatchingImageId,
- eyeCatchingImage: src.eyeCatchingImageId ? await DriveFiles.pack(src.eyeCatchingImageId) : null,
- attachedFiles: DriveFiles.packMany(await Promise.all(attachedFiles))
+ id: page.id,
+ createdAt: page.createdAt.toISOString(),
+ updatedAt: page.updatedAt.toISOString(),
+ userId: page.userId,
+ user: Users.pack(page.user || page.userId),
+ content: page.content,
+ variables: page.variables,
+ title: page.title,
+ name: page.name,
+ summary: page.summary,
+ alignCenter: page.alignCenter,
+ font: page.font,
+ eyeCatchingImageId: page.eyeCatchingImageId,
+ eyeCatchingImage: page.eyeCatchingImageId ? await DriveFiles.pack(page.eyeCatchingImageId) : null,
+ attachedFiles: DriveFiles.packMany(await Promise.all(attachedFiles)),
+ likedCount: page.likedCount,
+ isLiked: meId ? await PageLikes.findOne({ pageId: page.id, userId: meId }).then(x => x != null) : undefined,
});
}