diff options
| author | syuilo <syuilotan@yahoo.co.jp> | 2019-05-17 19:56:47 +0900 |
|---|---|---|
| committer | syuilo <syuilotan@yahoo.co.jp> | 2019-05-17 19:56:47 +0900 |
| commit | 380749051d1bdb63c667dd055f949f339c356e35 (patch) | |
| tree | 230a35893f77c0c7ee05fab6fb3e7dfc0d65b8ff /src/models | |
| parent | Update API docs (diff) | |
| download | misskey-380749051d1bdb63c667dd055f949f339c356e35.tar.gz misskey-380749051d1bdb63c667dd055f949f339c356e35.tar.bz2 misskey-380749051d1bdb63c667dd055f949f339c356e35.zip | |
ページにいいねできるように
Diffstat (limited to 'src/models')
| -rw-r--r-- | src/models/entities/page-like.ts | 33 | ||||
| -rw-r--r-- | src/models/entities/page.ts | 5 | ||||
| -rw-r--r-- | src/models/index.ts | 2 | ||||
| -rw-r--r-- | src/models/repositories/page-like.ts | 26 | ||||
| -rw-r--r-- | src/models/repositories/page.ts | 52 |
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, }); } |