| @@ -1,6 +1,6 @@ | ||||
| import { Module } from '@nestjs/common'; | ||||
| import { DI } from '@/di-symbols.js'; | ||||
| import { User, Note, Announcement, AnnouncementRead, App, NoteFavorite, NoteThreadMuting, NoteReaction, NoteUnread, Notification, Poll, PollVote, UserProfile, UserKeypair, UserPending, AttestationChallenge, UserSecurityKey, UserPublickey, UserList, UserListJoining, UserNotePining, UserIp, UsedUsername, Following, FollowRequest, Instance, Emoji, DriveFile, DriveFolder, Meta, Muting, RenoteMuting, Blocking, SwSubscription, Hashtag, AbuseUserReport, RegistrationTicket, AuthSession, AccessToken, Signin, Page, PageLike, GalleryPost, GalleryLike, ModerationLog, Clip, ClipNote, Antenna, AntennaNote, PromoNote, PromoRead, Relay, MutedNote, Channel, ChannelFollowing, ChannelNotePining, RegistryItem, Webhook, Ad, PasswordResetRequest, RetentionAggregation, FlashLike, Flash, Role, RoleAssignment } from './index.js'; | ||||
| import { User, Note, Announcement, AnnouncementRead, App, NoteFavorite, NoteThreadMuting, NoteReaction, NoteUnread, Notification, Poll, PollVote, UserProfile, UserKeypair, UserPending, AttestationChallenge, UserSecurityKey, UserPublickey, UserList, UserListJoining, UserNotePining, UserIp, UsedUsername, Following, FollowRequest, Instance, Emoji, DriveFile, DriveFolder, Meta, Muting, RenoteMuting, Blocking, SwSubscription, Hashtag, AbuseUserReport, RegistrationTicket, AuthSession, AccessToken, Signin, Page, PageLike, GalleryPost, GalleryLike, ModerationLog, Clip, ClipNote, Antenna, AntennaNote, PromoNote, PromoRead, Relay, MutedNote, Channel, ChannelFollowing, ChannelNotePining, RegistryItem, Webhook, Ad, PasswordResetRequest, RetentionAggregation, FlashLike, Flash, Role, RoleAssignment, ClipFavorite } from './index.js'; | ||||
| import type { DataSource } from 'typeorm'; | ||||
| import type { Provider } from '@nestjs/common'; | ||||
|  | ||||
| @@ -286,6 +286,12 @@ const $clipNotesRepository: Provider = { | ||||
| 	inject: [DI.db], | ||||
| }; | ||||
|  | ||||
| const $clipFavoritesRepository: Provider = { | ||||
| 	provide: DI.clipFavoritesRepository, | ||||
| 	useFactory: (db: DataSource) => db.getRepository(ClipFavorite), | ||||
| 	inject: [DI.db], | ||||
| }; | ||||
|  | ||||
| const $antennasRepository: Provider = { | ||||
| 	provide: DI.antennasRepository, | ||||
| 	useFactory: (db: DataSource) => db.getRepository(Antenna), | ||||
| @@ -445,6 +451,7 @@ const $roleAssignmentsRepository: Provider = { | ||||
| 		$moderationLogsRepository, | ||||
| 		$clipsRepository, | ||||
| 		$clipNotesRepository, | ||||
| 		$clipFavoritesRepository, | ||||
| 		$antennasRepository, | ||||
| 		$antennaNotesRepository, | ||||
| 		$promoNotesRepository, | ||||
| @@ -512,6 +519,7 @@ const $roleAssignmentsRepository: Provider = { | ||||
| 		$moderationLogsRepository, | ||||
| 		$clipsRepository, | ||||
| 		$clipNotesRepository, | ||||
| 		$clipFavoritesRepository, | ||||
| 		$antennasRepository, | ||||
| 		$antennaNotesRepository, | ||||
| 		$promoNotesRepository, | ||||
|   | ||||
| @@ -12,6 +12,12 @@ export class Clip { | ||||
| 	}) | ||||
| 	public createdAt: Date; | ||||
|  | ||||
| 	@Index() | ||||
| 	@Column('timestamp with time zone', { | ||||
| 		nullable: true, | ||||
| 	}) | ||||
| 	public lastClippedAt: Date | null; | ||||
|  | ||||
| 	@Index() | ||||
| 	@Column({ | ||||
| 		...id(), | ||||
|   | ||||
							
								
								
									
										33
									
								
								packages/backend/src/models/entities/ClipFavorite.ts
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										33
									
								
								packages/backend/src/models/entities/ClipFavorite.ts
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,33 @@ | ||||
| import { PrimaryColumn, Entity, Index, JoinColumn, Column, ManyToOne } from 'typeorm'; | ||||
| import { id } from '../id.js'; | ||||
| import { User } from './User.js'; | ||||
| import { Clip } from './Clip.js'; | ||||
|  | ||||
| @Entity() | ||||
| @Index(['userId', 'clipId'], { unique: true }) | ||||
| export class ClipFavorite { | ||||
| 	@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 clipId: Clip['id']; | ||||
|  | ||||
| 	@ManyToOne(type => Clip, { | ||||
| 		onDelete: 'CASCADE', | ||||
| 	}) | ||||
| 	@JoinColumn() | ||||
| 	public clip: Clip | null; | ||||
| } | ||||
| @@ -13,6 +13,7 @@ import { ChannelFollowing } from '@/models/entities/ChannelFollowing.js'; | ||||
| import { ChannelNotePining } from '@/models/entities/ChannelNotePining.js'; | ||||
| import { Clip } from '@/models/entities/Clip.js'; | ||||
| import { ClipNote } from '@/models/entities/ClipNote.js'; | ||||
| import { ClipFavorite } from '@/models/entities/ClipFavorite.js'; | ||||
| import { DriveFile } from '@/models/entities/DriveFile.js'; | ||||
| import { DriveFolder } from '@/models/entities/DriveFolder.js'; | ||||
| import { Emoji } from '@/models/entities/Emoji.js'; | ||||
| @@ -81,6 +82,7 @@ export { | ||||
| 	ChannelNotePining, | ||||
| 	Clip, | ||||
| 	ClipNote, | ||||
| 	ClipFavorite, | ||||
| 	DriveFile, | ||||
| 	DriveFolder, | ||||
| 	Emoji, | ||||
| @@ -148,6 +150,7 @@ export type ChannelFollowingsRepository = Repository<ChannelFollowing>; | ||||
| export type ChannelNotePiningsRepository = Repository<ChannelNotePining>; | ||||
| export type ClipsRepository = Repository<Clip>; | ||||
| export type ClipNotesRepository = Repository<ClipNote>; | ||||
| export type ClipFavoritesRepository = Repository<ClipFavorite>; | ||||
| export type DriveFilesRepository = Repository<DriveFile>; | ||||
| export type DriveFoldersRepository = Repository<DriveFolder>; | ||||
| export type EmojisRepository = Repository<Emoji>; | ||||
|   | ||||
| @@ -12,6 +12,11 @@ export const packedClipSchema = { | ||||
| 			optional: false, nullable: false, | ||||
| 			format: 'date-time', | ||||
| 		}, | ||||
| 		lastClippedAt: { | ||||
| 			type: 'string', | ||||
| 			optional: false, nullable: true, | ||||
| 			format: 'date-time', | ||||
| 		}, | ||||
| 		userId: { | ||||
| 			type: 'string', | ||||
| 			optional: false, nullable: false, | ||||
| @@ -34,5 +39,13 @@ export const packedClipSchema = { | ||||
| 			type: 'boolean', | ||||
| 			optional: false, nullable: false, | ||||
| 		}, | ||||
| 		isFavorited: { | ||||
| 			type: 'boolean', | ||||
| 			optional: true, nullable: false, | ||||
| 		}, | ||||
| 		favoritedCount: { | ||||
| 			type: 'number', | ||||
| 			optional: false, nullable: false, | ||||
| 		}, | ||||
| 	}, | ||||
| } as const; | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 syuilo
					syuilo