From 2feef8151625d9ba5d9c8b1850679b7fe84af809 Mon Sep 17 00:00:00 2001 From: syuilo Date: Thu, 13 Feb 2020 02:17:54 +0900 Subject: グループ招待の通知とか MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolve #5880 Resolve #5927 --- src/models/entities/notification.ts | 18 ++++++++-- src/models/entities/user-group-invitation.ts | 42 ++++++++++++++++++++++++ src/models/entities/user-group-invite.ts | 42 ------------------------ src/models/index.ts | 4 +-- src/models/repositories/notification.ts | 7 ++-- src/models/repositories/user-group-invitation.ts | 24 ++++++++++++++ src/models/repositories/user-group-invite.ts | 24 -------------- 7 files changed, 89 insertions(+), 72 deletions(-) create mode 100644 src/models/entities/user-group-invitation.ts delete mode 100644 src/models/entities/user-group-invite.ts create mode 100644 src/models/repositories/user-group-invitation.ts delete mode 100644 src/models/repositories/user-group-invite.ts (limited to 'src/models') diff --git a/src/models/entities/notification.ts b/src/models/entities/notification.ts index e359640e82..cd3fe9b01e 100644 --- a/src/models/entities/notification.ts +++ b/src/models/entities/notification.ts @@ -3,6 +3,7 @@ import { User } from './user'; import { id } from '../id'; import { Note } from './note'; import { FollowRequest } from './follow-request'; +import { UserGroupInvitation } from './user-group-invitation'; @Entity() export class Notification { @@ -57,12 +58,13 @@ export class Notification { * pollVote - (自分または自分がWatchしている)投稿の投票に投票された * receiveFollowRequest - フォローリクエストされた * followRequestAccepted - 自分の送ったフォローリクエストが承認された + * groupInvited - グループに招待された */ @Column('enum', { - enum: ['follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'receiveFollowRequest', 'followRequestAccepted'], + enum: ['follow', 'mention', 'reply', 'renote', 'quote', 'reaction', 'pollVote', 'receiveFollowRequest', 'followRequestAccepted', 'groupInvited'], comment: 'The type of the Notification.' }) - public type: 'follow' | 'mention' | 'reply' | 'renote' | 'quote' | 'reaction' | 'pollVote' | 'receiveFollowRequest' | 'followRequestAccepted'; + public type: 'follow' | 'mention' | 'reply' | 'renote' | 'quote' | 'reaction' | 'pollVote' | 'receiveFollowRequest' | 'followRequestAccepted' | 'groupInvited'; /** * 通知が読まれたかどうか @@ -97,6 +99,18 @@ export class Notification { @JoinColumn() public followRequest: FollowRequest | null; + @Column({ + ...id(), + nullable: true + }) + public userGroupInvitationId: UserGroupInvitation['id'] | null; + + @ManyToOne(type => UserGroupInvitation, { + onDelete: 'CASCADE' + }) + @JoinColumn() + public userGroupInvitation: UserGroupInvitation | null; + @Column('varchar', { length: 128, nullable: true }) diff --git a/src/models/entities/user-group-invitation.ts b/src/models/entities/user-group-invitation.ts new file mode 100644 index 0000000000..6fe8f20134 --- /dev/null +++ b/src/models/entities/user-group-invitation.ts @@ -0,0 +1,42 @@ +import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm'; +import { User } from './user'; +import { UserGroup } from './user-group'; +import { id } from '../id'; + +@Entity() +@Index(['userId', 'userGroupId'], { unique: true }) +export class UserGroupInvitation { + @PrimaryColumn(id()) + public id: string; + + @Column('timestamp with time zone', { + comment: 'The created date of the UserGroupInvitation.' + }) + public createdAt: Date; + + @Index() + @Column({ + ...id(), + comment: 'The user ID.' + }) + public userId: User['id']; + + @ManyToOne(type => User, { + onDelete: 'CASCADE' + }) + @JoinColumn() + public user: User | null; + + @Index() + @Column({ + ...id(), + comment: 'The group ID.' + }) + public userGroupId: UserGroup['id']; + + @ManyToOne(type => UserGroup, { + onDelete: 'CASCADE' + }) + @JoinColumn() + public userGroup: UserGroup | null; +} diff --git a/src/models/entities/user-group-invite.ts b/src/models/entities/user-group-invite.ts deleted file mode 100644 index 2adf2c024e..0000000000 --- a/src/models/entities/user-group-invite.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm'; -import { User } from './user'; -import { UserGroup } from './user-group'; -import { id } from '../id'; - -@Entity() -@Index(['userId', 'userGroupId'], { unique: true }) -export class UserGroupInvite { - @PrimaryColumn(id()) - public id: string; - - @Column('timestamp with time zone', { - comment: 'The created date of the UserGroupInvite.' - }) - public createdAt: Date; - - @Index() - @Column({ - ...id(), - comment: 'The user ID.' - }) - public userId: User['id']; - - @ManyToOne(type => User, { - onDelete: 'CASCADE' - }) - @JoinColumn() - public user: User | null; - - @Index() - @Column({ - ...id(), - comment: 'The group ID.' - }) - public userGroupId: UserGroup['id']; - - @ManyToOne(type => UserGroup, { - onDelete: 'CASCADE' - }) - @JoinColumn() - public userGroup: UserGroup | null; -} diff --git a/src/models/index.ts b/src/models/index.ts index 15a5c5470d..ea8fa6f911 100644 --- a/src/models/index.ts +++ b/src/models/index.ts @@ -24,7 +24,7 @@ import { UserListRepository } from './repositories/user-list'; import { UserListJoining } from './entities/user-list-joining'; import { UserGroupRepository } from './repositories/user-group'; import { UserGroupJoining } from './entities/user-group-joining'; -import { UserGroupInviteRepository } from './repositories/user-group-invite'; +import { UserGroupInvitationRepository } from './repositories/user-group-invitation'; import { FollowRequestRepository } from './repositories/follow-request'; import { MutingRepository } from './repositories/muting'; import { BlockingRepository } from './repositories/blocking'; @@ -71,7 +71,7 @@ export const UserLists = getCustomRepository(UserListRepository); export const UserListJoinings = getRepository(UserListJoining); export const UserGroups = getCustomRepository(UserGroupRepository); export const UserGroupJoinings = getRepository(UserGroupJoining); -export const UserGroupInvites = getCustomRepository(UserGroupInviteRepository); +export const UserGroupInvitations = getCustomRepository(UserGroupInvitationRepository); export const UserNotePinings = getRepository(UserNotePining); export const UsedUsernames = getRepository(UsedUsername); export const Followings = getCustomRepository(FollowingRepository); diff --git a/src/models/repositories/notification.ts b/src/models/repositories/notification.ts index 6407c19d4c..f020714f80 100644 --- a/src/models/repositories/notification.ts +++ b/src/models/repositories/notification.ts @@ -1,5 +1,5 @@ import { EntityRepository, Repository } from 'typeorm'; -import { Users, Notes } from '..'; +import { Users, Notes, UserGroupInvitations } from '..'; import { Notification } from '../entities/notification'; import { ensure } from '../../prelude/ensure'; import { awaitAll } from '../../prelude/await-all'; @@ -39,7 +39,10 @@ export class NotificationRepository extends Repository { ...(notification.type === 'pollVote' ? { note: Notes.pack(notification.note || notification.noteId!, notification.notifieeId), choice: notification.choice - } : {}) + } : {}), + ...(notification.type === 'groupInvited' ? { + invitation: UserGroupInvitations.pack(notification.userGroupInvitationId!), + } : {}), }); } diff --git a/src/models/repositories/user-group-invitation.ts b/src/models/repositories/user-group-invitation.ts new file mode 100644 index 0000000000..0d3ad525c3 --- /dev/null +++ b/src/models/repositories/user-group-invitation.ts @@ -0,0 +1,24 @@ +import { EntityRepository, Repository } from 'typeorm'; +import { UserGroupInvitation } from '../entities/user-group-invitation'; +import { UserGroups } from '..'; +import { ensure } from '../../prelude/ensure'; + +@EntityRepository(UserGroupInvitation) +export class UserGroupInvitationRepository extends Repository { + public async pack( + src: UserGroupInvitation['id'] | UserGroupInvitation, + ) { + const invitation = typeof src === 'object' ? src : await this.findOne(src).then(ensure); + + return { + id: invitation.id, + group: await UserGroups.pack(invitation.userGroup || invitation.userGroupId), + }; + } + + public packMany( + invitations: any[], + ) { + return Promise.all(invitations.map(x => this.pack(x))); + } +} diff --git a/src/models/repositories/user-group-invite.ts b/src/models/repositories/user-group-invite.ts deleted file mode 100644 index 1d4c2aa15f..0000000000 --- a/src/models/repositories/user-group-invite.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { EntityRepository, Repository } from 'typeorm'; -import { UserGroupInvite } from '../entities/user-group-invite'; -import { UserGroups } from '..'; -import { ensure } from '../../prelude/ensure'; - -@EntityRepository(UserGroupInvite) -export class UserGroupInviteRepository extends Repository { - public async pack( - src: UserGroupInvite['id'] | UserGroupInvite, - ) { - const invite = typeof src === 'object' ? src : await this.findOne(src).then(ensure); - - return { - id: invite.id, - group: await UserGroups.pack(invite.userGroup || invite.userGroupId), - }; - } - - public packMany( - invites: any[], - ) { - return Promise.all(invites.map(x => this.pack(x))); - } -} -- cgit v1.2.3-freya