ページにいいねできるように

This commit is contained in:
syuilo 2019-05-17 19:56:47 +09:00
parent d6ccb1725b
commit 380749051d
No known key found for this signature in database
GPG key ID: BDC4C49D06AB9D69
18 changed files with 489 additions and 191 deletions

View file

@ -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;
}

View file

@ -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;

View file

@ -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);

View file

@ -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)));
}
}

View file

@ -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,
});
}